当前位置: 首页 > 网络知识

Qt 三菱(Mitsubishi)PLC通信

时间:2026-01-29 09:26:07

最近两天在学习QT与三菱PLC串口通信,特此记录下来。
通信格式
我这里使用RS232C连接的,根据FX编程口协议!

设置参数,以读写的方式打开串口

1 serial>setPortName("c4"); 2 serial>setBaudRate(QSerialPort::Baud9600); 3 serial>setDataBits(QSerialPort::Data7); 4 serial>setParity(QSerialPort::EvenParity); 5 serial>setStopBits(QSerialPort::OneStop); 6 if(serial>open(QIODevice::ReadWrite)) 7

这里简单说明一下三菱PLC通信字串的结构

举个例子来说明如何使用
向寄存器D200中写入数值100:
  首先查表D200首地址为1190,对应16进制码 31H 31H 39H 30H寄存器占两个字节也就是16位,写入数据100,转换成二进制0000 0000 0110 0100,数据位按照高位在前,低位在后排列,也就是说排列的时候为0110 0100 0000 0000 排列,4个二进制对应16进制为6 4 0 0,转换成36H 34H 30H 30H,根据协议确定字串为02H 31H 31H 39H 30H 30H 32H 36H 34H 30H 30H 03H最后求和校验,将前面数据【31H,03H】相加得22B,取后两位 32H 42H。

1 QString str="02 31 31 31 39 30 30 32 36 34 30 30 03 32 42"; 2 QByteArray str1=QByteArray::frHex(str.toLatin1().data()); 3 serial>write(str1);

下面用串口调试助手读(将写入改成读取,删掉数据)一下寄存器里面得数据,可以看到得到的数据是6 4 0 0,高低位转换后0 0 6 4 ,0000 0000 0110 0010,和我们写入数据一致。

当然实际项目中,我们需要将实时获得的数据传给寄存器,就涉及到数据类型的转换
举个例子来说明
我们获得一个int类型的数据,比如30000个脉冲,现在需要把它写到寄存器D200中:
代码如下

1 long data_1=30000; 2 QString data_str=QString::number(data_1,16); 3 qDebug()<<"data_str is"<<data_str; 4 QByteArray data_2; 5 QString data_3=data_2.append(data_str).toHex(); 6 qDebug()<<"data_3 is"<<data_3; 7 8 9 QString data_4=str2+data_3+"03"; 10 qDebug()<<"data_4 is"<<data_4; 11 12 13 //计算和校验 14 int data_sum=0; 15 for(int i=2;i<data_4.length();i+=2) 16 21 qDebug()<<"data_6 is"<<data_sum; 22 QString data_7=QString::number(data_sum,16);//转换成16进制 23 qDebug()<<"data_7 is"<<data_7; 24 //溢出取后两位 25 QString data_8; 26 for(int i=data_7.length()2;i<data_7.length();++i) 27 30 qDebug()<<"data_8 is"<<data_8; 31 32 33 QByteArray data_9; 34 QString data_10=data_9.append(data_8).toHex(); 35 qDebug()<<"data_10 is"<<data_10; 36 37 38 QString data_total; 39 data_total=data_4+data_10; 40 qDebug()<<"data_total is"<<data_total; 41 42 43 QByteArray data_total_hex=QByteArray::frHex(data_total.toLatin1().data()); 44 qDebug()<<"data_total_hex is"<<data_total_hex; 45 46 47 serial>write(data_total_hex);

运行结果:
"02 31 31 31 39 30 30 32 "
str1 is "\x02"“1119002”
str2 is “0231313139303032”
data_str is “7530”
data_3 is “37353330”
data_4 is “02313131393030323735333003”
data_6 is 560
data_7 is “230”
data_8 is “30”
data_10 is “3330”
data_total is “023131313930303237353330033330”
data_total_hex is "\x02""11190027530\x03"“30”
我们打开PLC软件监视写入情况,发现结果和30000不一样

这是因为我们上面提到,写入数据排列有要求,比如y0y17 ,写入的时候就应该按照y7y0,y1710;30000的16进制码7530,也就是说写入数据的时候应该是3075,如果数据不够16位,应该在前面补0到16位。



上一篇:MCGS 昆仑通态触摸屏开机进度条、延时启动主画面设置教程
下一篇:Qt QCombobox中内容居中显示
Qt 三菱(Mitsubishi)
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素