使用Qt通过modbusRTU协议给西门子PLC点灯

需求

用上位机软件通过modbusRTU协议来控制下位机的Q0.0的指示灯

材料

电脑1
USB转485设备
1
PLC(s7-200)*1
下位机PLC程序:(STEP7-Micro/Win-sp9可以直接打开,程序兼容200SMART)
上位机Qt程序(Qt5.8-MinGW可直接打开)
.
Qt例程+PLC例程 提取码:4l8r

分析

上位机基于Qt开发,因为Qt有官方的Modbus库,支持Serial和Tcp两种方式
下位机PLC(s7-200 )

硬件连接

ModnusRTU物理层是RS485(当然也可以是光纤其它),电脑通过USB转485设备连接PLC,
PLC(s7-200)的两个端口不是标准的DB9排序,我们使用8(RS485-A)、3(RS485-B)针脚,

使用Qt通过modbusRTU协议给西门子PLC点灯_第1张图片使用Qt通过modbusRTU协议给西门子PLC点灯_第2张图片

qt的modbusRTU主站

xxx.pro文件增加
QT += serialport serialbus
xxx.c
xxx.c文件修改
连接数据接受槽
connect(reply, &QModbusReply::finished, this, &Widget::readReady);//绑定数据接受槽
修改串口号
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, QString("COM4"));//设置串口号
修改从站的数据请求
QModbusDataUnit writeUnit = QModbusDataUnit(QModbusDataUnit::HoldingRegisters, startAddress, numberOfEntries);//设置写入数据格式
modbusDevice->sendWriteRequest( writeUnit ,接收请求的从站的地址)); //填有写入请求参数的对象 和 被操作从站地址
读取从站的数据请求
QModbusDataUnit ReadRequest(QModbusDataUnit::HoldingRegisters, startAddress, numberOfEntries);
处理从从站里接收的数据
auto reply = qobject_cast(sender());//通过sender()获取发送信号对象的QObject指针,并且转化成QModbusReplyd对象类型的指针
const QModbusDataUnit unit = reply->result();//获取结果对象
unit.value(i)//获取地址i的值

测试结果

成功,可以在上位机上控制Q0.0的指示灯,且上位机上灯状态显示正常

你可能感兴趣的:(Qt,工业自动化)