添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
气势凌人的灯泡  ·  【vs2019】NETSDK1004 ...·  2 年前    · 
成熟的番茄  ·  ./autogen.sh: 9: ...·  2 年前    · 
聪明伶俐的勺子  ·  java - class ...·  2 年前    · 

工业数据采集:Python通过Modbus 读取RS232,RS485数据

之前的文章中,我们介绍过常见的工业协议按照OSI(Open System Interconnect)参考模型分到了不同层次,不太严谨的总结,我们可以分类如下:

软件接口 OPC
应用层 ModBus
数据链路层 CAN,ProfiBus
物理层 RS232,RS485

关于OPC以及如何从OPC中进行数据读写,我们已经在文章中解释过。

这个文章我们讲一下ModBus 和RS232, RS485。

Modbus是通讯协议,用于不同厂商设备之间交换数据。用日常例子解释,Modbus好比是一门语言。比如英语, RS232比作印度人,RS485比作美国人。印度人之间沟通用印度英语,类似于RS232基于modbus交流;美国人之间用美国英语,类似于RS485基于modbus交流。

ModBUS又分为

  • Modbus RTU,ASCII:所有物理接口都是串行(Serial)通信口:RS232,RS422,RS485
  • Modbus TCP:接口是以太网口,也就是电脑上的网络口,用Ethernet或者internet来连接



RS485和RS232又有什么区别呢?

由于RS232接口标准出现较早,难免有不足之处。针对RS232接口的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一

特性 RS232 RS485
接口物理接口 DB-25的25芯插头和插头座。我们现在接触到的一些设备与PC机连接所使用的RS232接口为DB-9的9芯插头和插头座,主要是因为我们所用的设备现在不使用对方的传输控制信号,只需三条接线:发送数据、接收数据、信号地;传输线缆多采用三芯屏蔽线。 一般为2个接线端口,分为A、B,一正、一负,较为简单;传输线缆多采用屏蔽双绞线。
传输距离 理论传输距离标准值为15米,实际工程中最大传输距离也不超过30米。 理论传输距离标准值为1200米,实际工程中可达到2500米。
传输数据的最大波特率 最高波特率为19200bps; 可达10Mbps
接口的电气特征 传输电平信号电平值较高(信号“1”为“-3V至-15V”,信号“0”为“3至15V”),易损坏接口电路的芯片,又不能和TTL电平相兼容,不能直接与TTL电路连接,需使用电平转换电路方可与TTL电路连接,并且抗干扰能力差。 逻辑“1”以两线间的电压差为+(2—6)V表示;逻辑“0”以两线间的电压差为-(2—6)V表示;接口信号电平值比RS232协议低了很多,就不像RS232协议那么容易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接,并且抗干扰能力也比RS232协议能力强。
连接接收器 在总线上只允许连接1个接收器,不支持多站收发功能。 在总线上允许连接多个收发器,最大可连接128个收发器

RS232

RS485

如何从通过Modbus RTU 从RS232/485读数据呢?

我们依然用python来演示。首先安装需要的包

pip install modbus_tk

详细信息: https://pypi.python.org/pypi/modbus_tk

用到的模拟软件

  • vspd虚拟串口:因为家里没有硬件,只有用虚拟串口假装已经连接了RS232/485
  • Modbus Poll:Modbus主设备模拟软件
  • Modbus Slave:Modbus从设备模拟软件
如果有兴趣也可以python自己写Master 和 Slave
  1. 用vspd虚拟串口在本机创建了虚拟串口COM1和COM2

2. 启动Modbus Poll 和 Modbus Slave 并分别连接COM1和COM2

connection ->connect

打开Communication Traffic显示连接成功,有数据传输

3. Modbus Poll 向 Modbus Slave发送数据

4. 断开Modbus Poll: Connction->Disconnect

5. 写python程序读取Slave数据。端口使用COM1(Poll断开后,COM1才可用)

数据读取成功!

我们这里只是浅尝辄止的演示了用python Modbus读数据。实际上后面的知识还有很多。比如读寄存器里的小数数据,读线圈,数据解析,读modbus TCP模式下的数据等等。推荐一本书,应该是行业内第一本

欢迎大家补充知识点,帮助所有读者一起成长。


源码

# -*- coding: utf_8 -*-
import serial
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
def mod(PORT="com1"):
    red = []
    alarm = ""
 # 设定串口为从站
        master = modbus_rtu.RtuMaster(serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1))
        master.set_timeout(5.0)
        master.set_verbose(True)
 # 读保持寄存器
        red = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 9)  # 这里可以修改需要读取的功能码
        print(red)
        alarm = "正常"
 return list(red), alarm