Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t使用Modbus与Modbus设备通信_Python_Modbus_Rs485_Minimalmodbus - Fatal编程技术网

Python Can';t使用Modbus与Modbus设备通信

Python Can';t使用Modbus与Modbus设备通信,python,modbus,rs485,minimalmodbus,Python,Modbus,Rs485,Minimalmodbus,我无法与使用Modbus、Modbus RTU的设备通信 我已经通过usb到rs-485适配器(FTDI芯片)a到a和B到B将设备连接到raspberry pi 设备配置如下所示: 端口设置: 波特率:9600 平价:没有 停止位:1 静音间隔:70毫秒 传输方式:RTU 接口2线RS485 ECM接头:DB9 连接:针脚1、4上的A。针脚6、9上的B Modbus保持寄存器(为本例简化) 交换的浮点格式: 40001(地址0)参数1 40003(地址2)参数2 我曾尝试使用

我无法与使用Modbus、Modbus RTU的设备通信

我已经通过usb到rs-485适配器(FTDI芯片)a到a和B到B将设备连接到raspberry pi

设备配置如下所示:

  • 端口设置

    • 波特率:9600
    • 平价:没有
    • 停止位:1
    • 静音间隔:70毫秒
    • 传输方式:RTU
  • 接口2线RS485

    • ECM接头:DB9
    • 连接:针脚1、4上的A。针脚6、9上的B
Modbus保持寄存器(为本例简化)

  • 交换的浮点格式:
    • 40001(地址0)参数1
    • 40003(地址2)参数2
我曾尝试使用原始串行命令与设备通信,以及使用pymodbus,现在是我最新的尝试minimal modbus。请参阅下面我使用minimalmodbus的代码尝试

此外,我知道串行适配器的工作原理,因为我使用它的各种其他串行传感器。唯一的区别是我现在正在使用modbus

导入Modbus
仪器=最小Modbus.仪器('/dev/tty/USB1',1)
instrument.debug=True
instrument.handle_local_echo=True#串行设备回显每次写入,因此
instrument.serial.baudrate=9600
instrument.serial.timeout=1
值=仪器读取寄存器(0,2)
打印值
我希望收到某种答复,即使是错误或不正确的,但我什么也得不到。Modbus的调试输出显示“IOError:与仪器无通信(无应答)”


与传感器要求相比,我的代码是否有任何明显的错误?我与制造商确认了我的接线,并且是正确的。

我看不到您那边有明显的错误。这相当困难,因为您使用的是硬件。 我将提供一些代码。我用它做了一个原型,它是一个带有USB到RS485转换器的树莓皮3B()

当我读取我使用的寄存器时,例如:

self.slave.read_register(2)
//or
self.slave.read_float(5)

我不确定我使用的是哪个python版本。我想是3.6.x.

我看不出你那边有什么明显的错误。这相当困难,因为您使用的是硬件。 我将提供一些代码。我用它做了一个原型,它是一个带有USB到RS485转换器的树莓皮3B()

当我读取我使用的寄存器时,例如:

self.slave.read_register(2)
//or
self.slave.read_float(5)

我不确定我使用的是哪个python版本。我想是3.6.x.

引用了您的有线电视手册:

USB-RS485-WE电缆允许通过更改FT232R中的位来启用/禁用本地回波 EEPROM。如果EEPROM中的CBUS4设置为“PWRON#”,则启用本地回波。如果EEPROM中的CBUS4为 为“TXDEN”本地回显设置被禁用。 用户可以通过www.ftdichip.com上的MPROG进行设置 本地回显的默认设置为禁用(CBUS4设置为“TXDEN”)

呸!里面有很多信息。根据对您问题的评论,您在minimalModbus上激活了软件回音处理,因为否则您的例程将不会等待另一端设备的响应。这让人想到您的电缆是否启用或禁用了本地回音

幸运的是,您可以很容易地进行检查。正如手册所说,只需获取MPROG.Extract并运行即可(是的,您需要Windows来安装此工具,但您可以在虚拟机上运行它)

将电缆连接到USB端口(如果正在运行虚拟机,请不要忘记将设备发送到虚拟机),然后在MPROG上选择
Tools-->Read and Parse

这是你应该得到的:


确保您在C4框中选择了TXEN。根据手册,默认情况下您应该有TXEN,如果您看到
PWRON
,则表示本地回音处于活动状态。禁用它,您就可以使用Modbus了。

引用电缆手册:

USB-RS485-WE电缆允许通过更改FT232R中的位来启用/禁用本地回波 EEPROM。如果EEPROM中的CBUS4设置为“PWRON#”,则启用本地回波。如果EEPROM中的CBUS4设置为 为“TXDEN”本地回显设置被禁用。 用户可以通过www.ftdichip.com上的MPROG进行设置 本地回显的默认设置为禁用(CBUS4设置为“TXDEN”)

呸!里面有很多信息。根据对您问题的评论,您在minimalModbus上激活了软件回音处理,因为否则您的例程将不会等待另一端设备的响应。这让人想到您的电缆是否启用或禁用了本地回音

幸运的是,您可以很容易地进行检查。正如手册所说,只需获取MPROG.Extract并运行即可(是的,您需要Windows来安装此工具,但您可以在虚拟机上运行它)

将电缆连接到USB端口(如果正在运行虚拟机,请不要忘记将设备发送到虚拟机),然后在MPROG上选择
Tools-->Read and Parse

这是你应该得到的:


确保您在C4框中选择了TXEN。根据手册,默认情况下您应该有TXEN,如果您看到
PWRON
这意味着本地回音处于活动状态。禁用它,您就可以使用Modbus了。

功能代码正确吗?您可以尝试
读取寄存器(0、2、3)
相反。你能用另一个主设备测试你的modbus从设备并确认它工作吗?@Bosz是的功能代码应该是正确的。我尝试了你的解决方案,但仍然存在相同的问题。@JWo我只有树莓pi(3b+)还有我的笔记本电脑,我可以作为主机使用。无论哪种方式,我都会使用python。我可能会尝试从我的笔记本电脑上运行它。你能发布一个到USB-to-RS485电缆的链接吗?半双工Modbus需要一个方向控制信号,你的电缆有硬件方向控制吗?功能代码正确吗?