假设树莓派8个可用GPIO端口分别连接LED,在很多工控领域一个LED可称为控制点,在modbus协议中一个控制点被抽象为线圈寄存器,操作相应的线圈寄存器有05H和15H指令。若使用modbus-tk便不必关心modbus协议的具体内容。下面就通过modbus中协议实现树莓派扩展板上LED的控制。
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
import logging
import threading
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus as modbus
import modbus_tk.modbus_rtu as modbus_rtu
import serial
import time
import RPi.GPIO as GPIO
logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")
# 创建server
server = modbus_rtu.RtuServer(serial.Serial("/dev/ttyAMA0", 9600))
slaver = server.add_slave(1)
# BCM GPIO编号
pins = [17,18,27,22,23,24,25,4]
def setup():
# 采用BCM编号
GPIO.setmode(GPIO.BCM)
# 设置所有GPIO为输出状态,且输出低电平
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
slaver.add_block("coil", cst.COILS, 0, 16)
slaver.set_values("coil", 0, 16*[0])
def loop():
logger.info("running...")
# 启动从机
server.start()
while True:
values = slaver.get_values("coil", 0, 8)
#print values[0]
for i in range(0, 8):
if values[i] == 1:
GPIO.output(pins[i], GPIO.HIGH)
else:
GPIO.output(pins[i], GPIO.LOW)
# 必要的延时
time.sleep(0.5)
def destory():
logger.info("destory")
for pin in pins:
GPIO.output(pin, GPIO.LOW)
GPIO.setup(pin, GPIO.IN)
# 停止从机
server.stop()
if __name__ == "__main__":
setup()
loop()
except KeyboardInterrupt:
destory()
创建一个RTU从机,使用串口/dev/ttyAMA0。请注意server和主机并不是一个概念,这里可能胡产生概念的混淆,这里server可理解为一个设备,而这个设备可以具有多个身份(例如具有多个从机ID)
【2】slaver = server.add_slave(1)
从机编号为1。一个server可以加入多个编号从机。
【3】slaver.add_block("coil", cst.COILS, 0, 16)
创建寄存器,寄存器的别名为coil,寄存器为线圈寄存器(COILS),寄存器起始地址为0,寄存器个数为16.
【4】slaver.set_values("coil", 0, 16*[0])
线圈寄存器的初始值全部为0
【5】values = slaver.get_values("coil", 0, 8)
读取线圈寄存器具体值,线圈寄存器地址从0到7,共8个。
需要注意的是,使用
Modbus
RTU
通讯时,还需要注意一些串口设置,例如数据位、停止位、校验等。在实际使用时,需要根据具体设备的规格说明来进行设置。在连接时,需要指定一些连接参数,例如设备的地址、端口、波特率等。
Modbus
RTU
是一种基于串口通讯的
Modbus
协议,它适用于需要长距离和高速传输的场合。在使用 Py
Modbus
库时,需要根据设备类型(TCP 还是
RTU
)来指定不同的。类创建了一个
Modbus
RTU
客户端对象,并指定了串口的设备文件名(方法读取了一个保持寄存器的值。
Modbus
是一个工业通信总线协议,在多个控制器中进行传输,消息内容是关于工业控制的指令和数据。
Modbus
是一种标准的通信协议,有规范的国标和世界标准,不同品牌的控制器可以组成
Modbus
网络,进行集中监控。
它属于一种互联通信网络,处于OSI模型的顶层——应用层,即只规定了消息(Message)的格式和各区域的功能、含义,而对于其他网络底层没有规定。
Modbus
协议并不关心经过何种类型的网络线路进行通信,但通常用到的网络线路是串行网络(如RS-232\485)和TCP/IP。
通信设备之间在逻辑上分
本篇基本配置好了
树莓派
串口的参数与收发函数,与
PC
端的模拟通信调试无误;
学习
了
modbus
-
RTU
协议,理解了命令结构与意义。之后准备用涡轮流量计进行实操,会在下一篇博客记录一下过程~
1、安装sudo apt-get install lib
modbus
-dev2、搭建
modbus
环境https://blog.csdn.net/starelegant/article/details/727829463、编写测试程序https://blog.csdn.net/qq_23670601/article/details/82155378#%E5%88%9D%E8%AF%95%E5%8C%...
工业采集设备支持
Modbus
Rtu
协议,通讯端口为232串口 或485接口,上位机连接采集终端,不方便走线【串口线 、485总线】,利用现有网络,通过串口服务器进行网络连采集接。
在
树莓派
基金会推出新的
树莓派
计算模块 3+ 系列不到四个月后,KUNBUS 公司正在为其新的 RevPi Connect + 配备这些模块。与具有 4GB eMMC 内存的旧版本相比,新设备现在具有 8GB、16GB 或 32GB eMMC 内存版本。Revpi Connect 开源的工业物联网网关KUNBUS Revpi Conenct作为小型的工业
PC
,其硬件基于
树莓派
计算模块3,采...
python 基于
modbus
_tk库
实现
modbus
TCP 主站和从站
最近做了一个
modbus
tcp 传输32位float的项目,参考了一些CSDN大佬的文章,这里做一个**整合和记录**。
之前利用Python进行
Modbus
_TCP进行数据接收,本次需要利用串口进行数据传输,
学习
Modbus
_
RTU
的简单
实现
首先要在创建两个虚拟串口,利用VSPD工具即可。在一台电脑上
实现
数据的发送和接收进入Python IDE进行slave端的编写import serialimport
modbus
_tkimport
modbus
_tk.defines as cstfrom
modbus
_tk i...
特别注意(地址格式 Address:ReceiveTime,Address:1-255 设备地址,ReceiveTime:0-100 接受数据的时间)我们设置为(1:100)(从站地址是1,接收时间是100),若只是设置1会提示设置格式错误。【PLC】->【莫迪康】->【Mod
RTU
Server】->【COM】变量类型 (I/0 整数) 若是线圈则选择(I/0离散)数据类型 (SHORT) 若是线圈则选择(Bit)寄存器类型 (R1) 若是线圈则选择(B1)在数据词典选项中新建一个数据。
之前利用Python进行
Modbus
_TCP进行数据接收,本次需要利用串口进行数据传输,
学习
Modbus
_
RTU
的简单
实现
首先要在创建两个虚拟串口,利用VSPD工具即可。在一台电脑上
实现
数据的发送和接收进入Python IDE进行slave端的编写import serialimport
modbus
_tkimport
modbus
_tk.defines as cstfrom
modbus
_tk i...