添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
假设树莓派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...