本帖最后由 我爱下载 于 2017-6-23 14:56 编辑
在python的学习之路1中,我已经搭建好了基本环境,使用modbus_tk库来作为modbus的驱动库,这次动真的,和英飞凌的H2Go模块通过Modbus接口完成电机驱动控制。
基本过程是,树莓派zero W作为modbus主机,通过串口与H2Go的Modbus 从机通讯,通过命令行输入控制命令,调节H2Go的正反转,启动和停止,加速和减速等。
H2Go的配合程序可以看我的这个帖子:
https://bbs.icxbk.com/community/thread-95454-1-1.html
这是树莓派和H2Go的接线图,利用树莓派的串口和H2Go的串口向量,完成物理连接。
运行结果展示,上面一堆的信息是python程序运行时候打印出来的
利用了Modbus_tk的RTU主机代码修改来的。
# -*- coding: utf_8 -*-
import sys
import serial
import modbus_tk
import modbus_tk.defines
as cst
from modbus_tk
import modbus_rtu
import time
#PORT = 'COM4'
PORT =
"/dev/serial0"
def main():
"""main"""
try:
global logger
logger = modbus_tk.utils.create_logger(
"console")
# 连接MODBUS rtu从机
# master = modbus_tcp.TcpMaster(host="192.168.2.2")
global master
master = modbus_rtu.RtuMaster(
serial.Serial(
port=PORT
, baudrate=
115200, bytesize=
8, parity=
'N', stopbits=
1, xonxoff=
0)
)
master.set_timeout(
5.0)
master.set_verbose(
True)
logger.info(
"connected")
# 读保持寄存器
logger.info(master.execute(
1, cst.READ_HOLDING_REGISTERS
, 1000, 5))
# 读输入寄存器
# logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 0, 16))
# 读线圈寄存器
# logger.info(master.execute(1, cst.READ_COILS, 0, 16))
# 读离散输入寄存器
# logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 16))
# 单个读写寄存器操作
# 写寄存器地址为0的保持寄存器
# logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 1001, output_value=21))
# logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 1001, 1))
# 写寄存器地址为0的线圈寄存器,写入内容为0(位操作)
# logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 0, output_value=0))
# logger.info(master.execute(1, cst.READ_COILS, 0, 1))
# 多个寄存器读写操作
# 写寄存器起始地址为0的保持寄存器,操作寄存器个数为4
# logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 999, output_value=))
# logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 999, 5))
# 写寄存器起始地址为0的线圈寄存器
# logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=))
# logger.info(master.execute(1, cst.READ_COILS, 0, 4))
except modbus_tk.modbus.ModbusError
, e:
logger.error(
"%s- Code=%d" % (e
, e.get_exception_code()))
if __name__ ==
"__main__":
main()
# str = raw_input('Enter your input:')
# list = str.split(" ")
if(
len(sys.argv) >=
5):
list2 =
for x
in sys.argv1:]:
list2.append(
eval(x))
list2.insert(
0, 0x55AA)
print(list2)
else:
print(
'请输入4个数字参数,1-使能,2-正反转,3-pwm占空比,4-pwm频率!')
logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 999, output_value = list2))
logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 999, 5))
如上是程序源码,执行的时候需要在命令行中输入参数,例如 python modbusmaster.py 0 1 10 1000
本帖最后由 我爱下载 于 2017-6-23 14:56 编辑
在python的学习之路1中,我已经搭建好了基本环境,使用modbus_tk库来作为modbus的驱动库,这次动真的,和英飞凌的H2Go模块通过Modbus接口完成电机驱动控制。
基本过程是,树莓派zero W作为modbus主机,通过串口与H2Go的Modbus 从机通讯,通过命令行输入控制命令,调节H2Go的正反转,启动和停止,加速和减速等。
H2Go的配合程序可以看我的这个帖子:
https://bbs.icxbk.com/community/thread-95454-1-1.html
这是树莓派和H2Go的接线图,利用树莓派的串口和H2Go的串口向量,完成物理连接。
运行结果展示,上面一堆的信息是python程序运行时候打印出来的
利用了Modbus_tk的RTU主机代码修改来的。
# -*- coding: utf_8 -*-
import sys
import serial
import modbus_tk
import modbus_tk.defines
as cst
from modbus_tk
import modbus_rtu
import time
#PORT = 'COM4'
PORT =
"/dev/serial0"
def main():
"""main"""
try:
global logger
logger = modbus_tk.utils.create_logger(
"console")
# 连接MODBUS rtu从机
# master = modbus_tcp.TcpMaster(host="192.168.2.2")
global master
master = modbus_rtu.RtuMaster(
serial.Serial(
port=PORT
, baudrate=
115200, bytesize=
8, parity=
'N', stopbits=
1, xonxoff=
0)
)
master.set_timeout(
5.0)
master.set_verbose(
True)
logger.info(
"connected")
# 读保持寄存器
logger.info(master.execute(
1, cst.READ_HOLDING_REGISTERS
, 1000, 5))
# 读输入寄存器
# logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 0, 16))
# 读线圈寄存器
# logger.info(master.execute(1, cst.READ_COILS, 0, 16))
# 读离散输入寄存器
# logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 16))
# 单个读写寄存器操作
# 写寄存器地址为0的保持寄存器
# logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 1001, output_value=21))
# logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 1001, 1))
# 写寄存器地址为0的线圈寄存器,写入内容为0(位操作)
# logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 0, output_value=0))
# logger.info(master.execute(1, cst.READ_COILS, 0, 1))
# 多个寄存器读写操作
# 写寄存器起始地址为0的保持寄存器,操作寄存器个数为4
# logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 999, output_value=))
# logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 999, 5))
# 写寄存器起始地址为0的线圈寄存器
# logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=))
# logger.info(master.execute(1, cst.READ_COILS, 0, 4))
except modbus_tk.modbus.ModbusError
, e:
logger.error(
"%s- Code=%d" % (e
, e.get_exception_code()))
if __name__ ==
"__main__":
main()
# str = raw_input('Enter your input:')
# list = str.split(" ")
if(
len(sys.argv) >=
5):
list2 =
for x
in sys.argv1:]:
list2.append(
eval(x))
list2.insert(
0, 0x55AA)
print(list2)
else:
print(
'请输入4个数字参数,1-使能,2-正反转,3-pwm占空比,4-pwm频率!')
logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 999, output_value = list2))
logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 999, 5))
如上是程序源码,执行的时候需要在命令行中输入参数,例如 python modbusmaster.py 0 1 10 1000