一、总概括:
Modbus Slave搭配-Modbus Poll收发数据
Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。与之成套存在的另一个软件--Modbus Poll,则是模拟Modbus协议主机的上位机软件。该软件内部封装标准Modbus协议栈,通过图形化界面使得操作更为简便。目前软件支持01、02、03、04、05、06、15、16功能码,原始报文查看,数据记录等功能,是调试Modbus协议栈的好帮手。
1.qModMaster配合ModbusSlave数据收发
ModbusSlave: 从机,作为服务器,监听端口
qModMaster: 主机,作为客户端,负责与从机读写数据
主站(Master),是一个控制设备,负责发起和管理 Modbus TCP 通信。它可以向从站发送读取或写入请求,并接收从站返回的响应。主站通常是一个上位机或监控系统,负责控制和监视整个系统。
从站(Slave):从站是被动设备,响应主站的请求并提供数据。它可以是传感器、PLC 或其他设备。从站接收主站的读取或写入请求,并返回相应的数据或执行相应的操作。
Modbus TCP中,主站通常是tcp的client端,从站是tcp的server端,开启默认端口502。这个很容易混淆,这里在强调下。
二、利用libmodbus库编写代码模拟从机功能,并进行代码分析
windows下模拟运行modbusmaster 参考 https://blog.csdn.net/weixin_46366218/article/details/129402339 或者
https://blog.csdn.net/zzh_AI/article/details/106994121?spm=1001.2014.3001.5506 发现写入失败,
参考 https://blog.csdn.net/qq_40531408/article/details/126689032 中的代码,写入失败,把写入的代码注释掉,读取ok
---modbus poll中setup选择的function选择16 Write Muitiple Registers中可以进行写操作,修改modbus slave中的值,是否将程序中的调用接口功能码修改一下也可以进行写操作呢?
三、开源代码QModMaster配合Modbus Slave使用
qt模拟modbus master https://blog.csdn.net/yyz_1987/article/details/132172864?spm=1001.2014.3001.5502
代码模拟modslave master中ip地址为127.0.0.1 502 modbus slave中setup选择any address
---至此tcp通信基本OK
四、rtu通信 串口通信
modbus master和modbus poll进行rtu通信 https://blog.csdn.net/qq_36961530/article/details/107185858?spm=1001.2014.3001.5502
先下载和使用虚拟串口 https://cloud.tencent.com/developer/article/2311089
参考代码示例 https://blog.csdn.net/dengjin20104042056/article/details/116795320
利用modbus slave和自写的main程序通信成功
五、遇到的问题
QModbusMaster与ModbusSlave通信
QModbus中的 m_modbus = modbus_new_rtu(port.toLatin1().constData(),baud,parity.toLatin1(),dataBits,stopBits,RTS);
报错“Connection failed. Could not connect to serial port”的问题
将其中的参数 parity.toLatin1() 改为‘N’即可了
原因:1,QChar 转换char: char QChar::toLatin1();char QChar::toAscii();
Qstring用函数QChar EUtils::parity(QString p)只取第一个字符之后 转换成了QChar 但是取到的值还是‘奇’ ‘偶’ ‘无’这三个值 不符合 modbus_new_rtu的char值的判断