我试图通过无线网络向温度控制器(PID)发送Modbus RTU消息,该设备接受传入的TCP/IP数据包,然后通过RS455连接转发其数据(让我们称该设备为“转换器”):
PC -(WiFi)-路由器-(RJ45)-转换器-(RS485)--> PID
该转换器被市场上称为Modbus TCP到RTU转换器,但它不是。这造成了一些混乱和挫折。但是,我决定继续使用该设备,并重写我的HMI代码来向其发送Modbus RTU消息,而不是Modbus TCP消息。
在开始重写代码之前,我想确保我知道自己在做什么,并且能够成功地向温度控制器发送请求并接收响应。我决定(也许是天真地)使用netcat通过命令行发送这条消息是最好的方法。
我正在发送的Modbus RTU消息包含以下请求:
H 117CRC:51840H 218f 219
转换器上的套接字将用于:
192.168.0.5
因此,我发送的netcat命令如下:
echo -e -n '\x01\x03\x10\x00\x00\x01\x80\xCA' | nc 192.168.0.5 2000 -p 42998在另一个终端,我正在收听:
nc -l 42998我也用Wireshark捕捉流量,这样我就可以看到网络上发生了什么。
网络上正在进行的是:
一个好的,坚定的handshake
H 139我想要的h 240f 241
很明显,我在我的netcat上什么也没看到。
所以我想弄清楚温度控制器的反应是怎么回事。假设错误在于我,而不是硬件(冒着让你和我出丑的风险),下面是我认为可能出错的地方--或者至少我有一个问题,因为我在这一点上完全超出了我的深度:
Modbus RTU消息由11位字节组成--一个开始位、八个数据位、一个停止位和一个奇偶位,如果我只与netcat一起发送8位字节,以便温度控制器接收到消息,然后简单地以垃圾的形式丢弃它呢?,或者如果netcat发送11个字节,但奇偶性不同,甚至停止和启动位也不同??
我仔细研究了一下这个想法,并试着:
stty cs8 parenb -parodd然后又发出了netcat命令,但是没什么区别,我真的觉得我现在就像河岸上的一条鱼,我很难找到tty,终端仿真器之类的信息,这些都让我点击。
Brits' answer to this SO question声明这种设备的驱动程序作为串口出现,而我的设备确实有这样的驱动程序--这些驱动程序是添加了启动、停止和奇偶位信息,还是要求它们在输入时出现?
根据你在这类事情上的更多经验,你有什么想法吗?有什么建议我可以解决吗?
发布于 2022-10-19 04:42:33
最后,一切都很顺利:
sudo echo -e -n '\x01\x03\x10\x00\x00\x01\x80\xCA' | nc 192.168.0.5 2000问题是,TCP设备上的数据I/O使用RS485 A表示高,B使用B表示低,这与标准相反,但显然并不少见。
很烦人,但给你。小心点,我想。
https://stackoverflow.com/questions/74024146
复制相似问题