如何发送Hex数据?

时间:2010-06-30 03:54:43

标签: ruby perl modbus

我试图通过modbusTCP或modbus串口与modbus从站通信。制造商。 (partlow)有一个ASCII通讯手册(http://www.partlow.com/uploadedFiles/Downloads/1160%20ASCII%20Comms%20Manual.pdf),看起来与标准通讯方法(http://en.wikipedia.org/wiki/Modbus)不同。很多现有的代码都设置为使用线圈的正常modbus寻址等等,这些人似乎(至少对我而言)与这些人不同。

那么,通过ruby或perl,我该如何发送十六进制数据?我可能做得很好,但是,如果我将“0DFA”写入串口......那可以吗?或者我是否需要先将其转换为较低层,或以某种方式表示它?

已经做了很多工作并且可能让自己混淆了(让事情变得比他们更复杂)但是,我正在尝试用这个仪表建立通信,我可以看到TX活动指示灯闪烁但是没有RX,这意味着我的数据格式错误......

一直在努力解决这个问题(以及一些perl片段,试图找到有用的东西): http://www.messen-und-deuten.de/modbus.html

我正在通过终端服务器进行通信,终端服务器接受modbusTCP(这个脚本使用)但是我在将comm手册中的内容应用到上面的代码时遇到了麻烦,以便正确地格式化数据包。

2 个答案:

答案 0 :(得分:3)

您在谈论原始数据吗?有几种方法,包括

print HANDLE "\x{OD}\x{FA}";

printf HANDLE "%c%c", 0x0D, 0xFA;

print HANDLE "\015\372";       # octal notation

print HANDLE pack("C*", 0x0D, 0xFA);

syswrite HANDLE, "\x{OD}\x{FA}", 2;

答案 1 :(得分:0)

我建议您查看RModBus库,以帮助处理Ruby语言中TCP / IP上的一些数据包形成的复杂性。

您正在与之通信的设备始终可能需要或相反地避免使用modicon表示法。当我第一次尝试从PLC读取寄存器时,这有点打嗝。我在Modbus中找到的另一个“问题”是,由于实现中的怪癖,一些寻址系统被一个偏移。