作者:billy

版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

前言

上位机与PLC通信有很多种方式,比如CPU编程口、网口、串口、总线连接等等。本章节记录一下如何通过串口让PLC控制程序执行操作。博主之前写过一章使用网口与PLC通信,具体请参考:Qt使用 MX Component 插件与三菱PLC通信

功能预览

通信协议

所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,属于OSI七层参考模型中的数据链路层。目前,采用的通信协议有两类:异步协议和同步协议。

总的来说,通讯协议就是通讯双方共同遵循的一套规则,定义协议的原则是尽可能的简单以提高传输率,尽可能的具有安全性保证数据传输完整正确。基于这2点规则,我们一个通讯协议应该是这样的:

头 + 数据长度 + 数据正文 + 校验

查看端口

我的代码

需要在 pro 文件中导入串口模块:

QT += serialport

serialportcontrol.h

#ifndef SERIALPORTCONTROL_H

#define SERIALPORTCONTROL_H

#include #include #include class SerialPortControl : public QThread

{

Q_OBJECT

public:

explicit SerialPortControl();

bool open(QString portName);

void close();

void writeResult(QString ret);

virtual void run() override;

signals:

void startWork();

private:

QSerialPort m_serialPort;

bool isStarted;

};

#endif // SERIALPORTCONTROL_H

serialportcontrol.cpp

#include "serialportcontrol.h"

#include "globalfun.h"

SerialPortControl::SerialPortControl()

{

isStarted = false;

}

bool SerialPortControl::open(QString portName)

{

// 设置串口名称

m_serialPort.setPortName(portName);

// 设置波特率

switch (GlobalValue::atm_bte) {

case 0: m_serialPort.setBaudRate(QSerialPort::Baud1200); break;

case 1: m_serialPort.setBaudRate(QSerialPort::Baud2400); break;

case 2: m_serialPort.setBaudRate(QSerialPort::Baud4800); break;

case 3: m_serialPort.setBaudRate(QSerialPort::Baud9600); break;

case 4: m_serialPort.setBaudRate(QSerialPort::Baud19200); break;

case 5: m_serialPort.setBaudRate(QSerialPort::Baud38400); break;

case 6: m_serialPort.setBaudRate(QSerialPort::Baud57600); break;

case 7: m_serialPort.setBaudRate(QSerialPort::Baud115200); break;

default: m_serialPort.setBaudRate(QSerialPort::UnknownBaud); break;

}

// 设置数据位

switch (GlobalValue::atm_dbt) {

case 0: m_serialPort.setDataBits(QSerialPort::Data5); break;

case 1: m_serialPort.setDataBits(QSerialPort::Data6); break;

case 2: m_serialPort.setDataBits(QSerialPort::Data7); break;

case 3: m_serialPort.setDataBits(QSerialPort::Data8); break;

default: m_serialPort.setDataBits(QSerialPort::UnknownDataBits); break;

}

// 设置奇偶校验

switch (GlobalValue::atm_cbt) {

case 0: m_serialPort.setParity(QSerialPort::NoParity); break;

case 1: m_serialPort.setParity(QSerialPort::EvenParity); break;

case 2: m_serialPort.setParity(QSerialPort::OddParity); break;

case 3: m_serialPort.setParity(QSerialPort::SpaceParity); break;

case 4: m_serialPort.setParity(QSerialPort::MarkParity); break;

default: m_serialPort.setParity(QSerialPort::UnknownParity); break;

}

// 设置停止位

switch (GlobalValue::atm_sbt) {

case 0: m_serialPort.setStopBits(QSerialPort::OneStop); break;

case 1: m_serialPort.setStopBits(QSerialPort::OneAndHalfStop); break;

case 2: m_serialPort.setStopBits(QSerialPort::TwoStop); break;

default: m_serialPort.setStopBits(QSerialPort::UnknownStopBits); break;

}

// 设置流控制

switch (GlobalValue::atm_fcl) {

case 0: m_serialPort.setFlowControl(QSerialPort::NoFlowControl); break;

case 1: m_serialPort.setFlowControl(QSerialPort::HardwareControl); break;

case 2: m_serialPort.setFlowControl(QSerialPort::SoftwareControl); break;

default: m_serialPort.setFlowControl(QSerialPort::UnknownFlowControl); break;

}

// 打开串口

isStarted = m_serialPort.open(QIODevice::ReadWrite);

return isStarted;

}

void SerialPortControl::close()

{

// 关闭串口

isStarted = false;

m_serialPort.close();

}

void SerialPortControl::writeResult(QString ret)

{

if ( m_serialPort.isOpen() ) {

m_serialPort.write(ret.toLatin1());

}

}

void SerialPortControl::run()

{

while ( isStarted )

{

// 读取串口

QByteArray buffer = m_serialPort.readAll();

QString str = QString(buffer);

if ( str == "do" ) {

emit startWork();

}

GlobalFun::bsleep(100);

}

}

mainwindow.cpp

void MainWindow::initSerialport()

{

qDebug() << "initSerialport !";

m_spCtl = new SerialPortControl();

// 获取可用串口号

for ( auto &temp : QSerialPortInfo::availablePorts() )

{

ui->serialPortBox->addItem(temp.portName());

}

connect(m_spCtl, &SerialPortControl::startWork, this, [&](){ startCalculation(); }, Qt::QueuedConnection);

}

void MainWindow::on_fillData()

{

......

QApplication::processEvents();

// 往串口里写入计算结果

if ( m_spCtl->isRunning() ) {

QString totalRet = ui->data_table->item(dRow, 3)->text();

m_spCtl->writeResult(totalRet);

}

}

plc串口通讯 qt_Qt 串口通信之使用三菱PLC控制程序相关推荐

  1. plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...

    电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 1,什么是串口通讯? 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 ...

  2. 上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,

    上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通讯,, ...

  3. 上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯

    上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通讯,, ...

  4. plc串口通讯 qt_QT与PLC通信

    最近两天在学习QT与三菱PLC串口通信,特此记录下来. 通信格式 我这里使用RS-232C连接的,根据FX编程口协议! 设置参数,以读写的方式打开串口 serial->setPortName(& ...

  5. plc串口通讯 qt_Qt 编写串口调试助手

    一.成品图展示 成品图如下所示: 二.串口通讯步骤 1.在工程文件(.pro)中添加串口通信相关运行库:QT += serialport 2.在头文件中添加: #include #include 3. ...

  6. xk3190串口通讯JAVA开发包_常用品牌plc通讯协议汇总学习

    一.美系厂家Rockwell ABRockwell的PLC主要是包括:PLC2.PLC3.PLC5.SLC500.ControlLogix等型号,PLC2和PLC3是早期型号,现在用的比较多的小型PL ...

  7. 如何看懂串口通讯协议_一文看懂PLC的通讯方式——AB系统(一)

    写在前面 一直以来,PLC跟其他设备的通讯方式都是自动化工程师入门学习的难点和要点.说它难,因为这里面牵扯到了数据通讯的一些知识,大多数从事PLC工作的人员都是从电气.电子.自动化.机电等相关专业出身 ...

  8. c#串口通讯 c#串口连接电子秤电子天平

    1.串口连接 串口通讯可以直接用RS232串口线连接电脑和电子秤,也可以用虚拟串口模拟数据. 注:RS232个人电脑不识别端口的话,需要安装对应的驱动,如下图 代码中需要配置正确的端口号,查看物理端口 ...

  9. 三菱fx2n做从站的modbus通讯_3个月高效掌握三菱PLC!100多个知识点,四个阶段经验大总结...

    经常有人问我,学三菱PLC好还是学西门子的好?如果没有职业的硬性要求,三菱PLC能让大家快速入门自动化行业. 日本以小型PLC著称,三菱PLC就是日系品牌,指令丰富,编程直观易懂,学习起来会比较轻松. ...

最新文章

  1. java 匿名对象有引用_java 匿名内部类对象持有外部类对象的引用
  2. 基础篇 第四节 项目进度计划编辑 之 任务关联性设定
  3. 创业公司如何实施敏捷开发(转载)
  4. 第一节 接口概述 [转贴]
  5. a as as big rat_超好玩!12句英语绕口令,你能一口气读完几句?
  6. OpenStack - 学习经验总结
  7. 时间序列深度学习:seq2seq 模型预测太阳黑子
  8. 为antd tree组件 在onSelect时获取额外数据
  9. 未找到beta版怎么解决_微软推出Win10 20H2 Build 19042.541版 修复WSL2启动时的报错问题...
  10. COGS2259 异化多肽
  11. CodeForces 964A Splits
  12. 面试题:你的缺点是什么?(为难我?怎么可能)
  13. 如何使用VisiPic消除重复的照片
  14. Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
  15. FusionCharts简介
  16. 四十三、迎接挑战,苦练内功,迎接春天的到来
  17. 【测控电路】V/f转换器
  18. Oracle的常用技巧
  19. 5G版iPhone确定后年登场!
  20. 验证(Javascript和正则表达式)

热门文章

  1. 使用docker-compose启动springboot项目
  2. 危险场景分类(NHTSA 37 Pre-Crash Scenarios)
  3. centos7 安装nmon
  4. 【转载】搞懂PointNet++,这篇文章就够了!
  5. 祖-玛珑全新馥郁系列香氛“香根草与香子兰”上市
  6. 【Free5GC】run.sh脚本测试流程
  7. 什么是蓝天使环保认证?
  8. 【cocos精品】正版《仙剑奇侠传》带你重温仙剑之旅
  9. CAD/CAM氧化锆义齿车床假牙雕铣加工高速精密电主轴
  10. 双非大厂测试员亲述:对测试员来说,学历重要吗?