TCP-508N使用python modbus_tk库控制总结

我打算用PCL做三轮车的电动控制,上层用python写,通过modbus_tk库来组织发送协议,使用modbus_tk库前还需要调用pyserial库,所以某种意义上modbus_tk库就是数据结构的打包发送函数。PLC未到,先用带modbus协议的I/O模块做测试。

首先modbus_tk中的宏定义如下:

#modbus exception codes
ILLEGAL_FUNCTION = 1
ILLEGAL_DATA_ADDRESS = 2
ILLEGAL_DATA_VALUE = 3
SLAVE_DEVICE_FAILURE = 4
COMMAND_ACKNOWLEDGE = 5
SLAVE_DEVICE_BUSY = 6
MEMORY_PARITY_ERROR = 8

#supported modbus functions
READ_COILS = 1
READ_DISCRETE_INPUTS = 2
READ_HOLDING_REGISTERS = 3
READ_INPUT_REGISTERS = 4
WRITE_SINGLE_COIL = 5
WRITE_SINGLE_REGISTER = 6
READ_EXCEPTION_STATUS = 7
DIAGNOSTIC = 8
REPORT_SLAVE_ID = 17
WRITE_MULTIPLE_COILS = 15
WRITE_MULTIPLE_REGISTERS = 16
READ_WRITE_MULTIPLE_REGISTERS = 23
DEVICE_INFO = 43

#supported block types
COILS = 1
DISCRETE_INPUTS = 2
HOLDING_REGISTERS = 3
ANALOG_INPUTS = 4

TCP-508的接线图纸如下:

python程序编写参考了如下博客:https://blog.csdn.net/fan0520/article/details/51459057     http://www.cnblogs.com/siyun/p/10158444.html      https://blog.csdn.net/weixin_42625909/article/details/85337566

按照以上博客,修改一下很快就能控制继电器的输出,但是当过渡到对模拟量的输出时,一直在抛非法地址的异常,向寄存器中写值用

logger.info(modbus_master.execute(1, cst.WRITE_SINGLE_REGISTER, 40001, output_value = 20000))

使用logger能够很好的打印出发送的数据结构,截取发送log为 1-6-156-65-78-32-195-246,其中1为设备地址,6为操作码,156-65为地址,78-32为写入寄存器值,195-246为CRC校验值。

为了找出原因,使用了生产商给出的控制测试软件进行发送数据抓取,发现了与说明不一致的地方,对于这款I/O模块,写入的寄存器只能从0开始,数字输出为继电器,以零开始写入数值,但是写入操作码为线圈写入,另外一个输出为模拟量输出,其操作码为寄存器写入,通过这种方式,起始地址都是0但操作码不同就能区分两者。对于DI和AI,读取AI使用读寄存器操作就能得到结果。DI似乎可以用读取线圈方式读入(???生产商给出软件不能测出)自己的写从地址0开始读入线圈值未报错。可能PLC能写入其他地址吧。

猜你喜欢

转载自blog.csdn.net/mgou1234/article/details/89000535