Modbus协议
Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
Modbus同时支持TCP
和RTU
协议
Modbus master
主机,连接远程从机来采集数据
Modbus slave
从机,有监听端口,从机一般为PLC。
步骤:
从机先从modbus上采集数据,主机在发送modbus协议请求从机的数据
Modbus寄存器种类说明
1.线圈状态
输出端口,可读可写
2.离散输入状态
输入端口,可读不可写
3.保持寄存器
控制器运行时被设定的某些参数,可读可写
4.输入寄存器
控制器运行时从外部设备获得的某些参数,可读不可写
寄存器地址
寄存器PLC地址:存放于控制器中的地址,第一位为寄存器类型,后四位代表地址(十进制)
寄存器协议地址:通信时候使用的寄存器地址,用十六进制代替PLC地址中的十进制(类型一位已区分,不用管),例如:寄存器PLC地址:40001/30003,那么寄存器协议地址:0x0000/0x0002。
连接modbus Rtu slave:
import serial
from modbus_tk import modbus_rtu
import modbus_tk
import modbus_tk.defines as cst
master=modbus_rtu.RtuMaster(serial.Serial(port=’COM10’, #串口号
baudrate=115200,#波特率
bytesize=8,#字节长度
parity=’O’,#奇偶校验(偶)
stopbits=1,#停止位
xonxoff=0))#流控制
master.execute(1,cst. READ_HOLDING_REGISTERS,0,16)#对寄存器进行操作
参数说明:
slaver 从机地址 modbus TCP时可以忽略该参数
function_code 功能码 modbus_tk.modbus_tcp中定义
starting_address 寄存器起始地址 可设定
quantity_of_x 寄存器数量 可设定
output_value 输出内容 读操作是无效,写操作是输入为List类型
data_format="" 数据格式
功能代码cst
1~255中1~21是常用的,以下是读写专用的功能码
READ_COILS = 01
读线圈,位操作
READ_DISCRETE_INPUTS = 02
读离散输入状态,位操作
READ_HOLDING_REGISTERS = 03
读保持寄存器,字操作
READ_INPUT_REGISTERS = 04
读输入寄存器,字操作
WRITE_SINGLE_COIL = 05
写单线圈,位操作
WRITE_SINGLE_REGISTER = 06
写单一寄存器,字操作
WRITE_MULTIPLE_COILS = 15
写多个线圈【强制多点线圈】,位操作
WRITE_MULTIPLE_REGISTERS = 16
写多寄存器【写乘法寄存器】,字操作
连接到远程的slave
master=modbus_tcp.TcpMaster(“ip地址”,端口号)
master.set_timeout(5.0)
2.调用modbus_tk库的接口,向slave采集数据
以上就是实现通信中modbus协议相关内容,
下面再说一下外在的一些连接配置。
硬件环境搭建
1、硬件:伺服驱动器/伺服电机/串口服务器(转接器)/pc/网线
2、连接:
伺服驱动器连接串口服务器,串口服务器通过网线再连接笔记本,这里要转接485转USB,因为笔记本没有COM口,安装好转接线的驱动(专门给电脑安装一个虚拟COM口),连接完成。
3、调试
第一种:使用串口助手发送指令01 06 4E 20 FE 0C DF 4D 00 电机运转
分别代表的是01控制节点,06功能码写数据,4E 20表示寄存器位置,FE 0C是写入的数据,DF 4D是CRC校验(可以通过CRC校验器算出来),00表示停止位。
第二种:使用modbus调试助手发送指令,不需要计算校验
第三种:利用python库实现。
Modbus_tk
:支持modbus tcp/rtu
Pymodbus
:使用twisted实现的modbus完整协议(支持异步通讯)
MinimalModbus
:只支持modbus rtu
设置及写入速度:
import minimalmodbus
#设置第一台slave
axis1=minimalmodbus.Instrument(‘com1’,1)
axis1.serial.baudrate=9600
axis2.serial.timeout=1
#设置第二台slave
axis2=minimalmodbus.Instrument(‘com2’,2)
axis1.serial.baudrate=9600
axis2.serial.timeout=1
#设置转速
axis1.write_register(20000,0x1F)
axis1.write_register(20000,0xDF)