python 与设置连接通信(modbus)

Modbus协议
Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

Modbus同时支持TCPRTU协议
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 写多寄存器【写乘法寄存器】,字操作

  1. 连接到远程的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)

你可能感兴趣的:(python程控)