5.6 综合案例-RTU-Part2

1.简介

 本案例通过haas506对继电器进行操控。

  • 继电器参数
    在这里插入图片描述

在这里插入图片描述

  • 设备购买链接

  链接: Haas506.

  链接: 郎汉德继电器.

  • 设备接线

在这里插入图片描述

2.测试前操作

(1)设置波特率
 因为“建大仁科光照温湿度变送器”和“郎汉德6路继电器”两个传感器公用一条rs485总线,所以,两个传感器需要设定为相同的工作波特率。“建大仁科光照温湿度变送器”默认工作波特率为4800, “郎汉德6路继电器”默认工作波特率为9600. 所以,本案例将“郎汉德6路继电器”默认工作波特率设定为4800,具体设置方法参考main.py。

(2)设置设备地址
 因为“建大仁科光照温湿度变送器”和“郎汉德6路继电器”两个传感器公用一条rs485总线,所以这两个设备的设备地址不应该相同(默认都是1)。所以本案例将继电器的设备地址改为3。即将继电器上的拨码开关中的第二个推上去。详细内容可以参考文章末尾的"继电器手册"。

3.测试代码

  • main.py
import utime 
from app_zzio606 import ZZIO606
import modbus as mb


def test_zzio606():
    # modbus写寄存器值:mb.writeHoldingRegister(devAddr,modbusRegAddr,data,timeout)
    # 例如:
    #     mb.writeHoldingRegister(3,0x03e8,0,200) 将波特率改为9600(设备地址为3,寄存器地址为0x03e8,写入的数据为0,超时时间200ms)
    #     mb.writeHoldingRegister(3,0x03e8,1,200) 将波特率改为2400
    #     mb.writeHoldingRegister(3,0x03e8,2,200) 将波特率改为4800
    #     mb.writeHoldingRegister(3,0x03e8,3,200) 将波特率改为9600
    #     mb.writeHoldingRegister(3,0x03e8,4,200) 将波特率改为19200
    #     mb.writeHoldingRegister(3,0x03e8,5,200) 将波特率改为38400
    # 例如:设备默认的波特率是9600,将波特率改为4800,请启用下面被注释掉的3行代码。
    #       烧录程序后,将这3条代码注释掉。后续写代码就不需要对波特率进行操作了。      
	# mb.init("modbus_485_9600")
	# mb.writeHoldingRegister(1,0x03e8,2,200)
	# mb.deinit()

    ret = mb.init('modbus_485_4800')
    if ret < 0:
        raise ValueError("init modbus failed.")
    zzio606Obj = ZZIO606(mb, 3)


   #继电器全打开   
    for i in range(6):
        zzio606Obj.openChannel(i)
        utime.sleep(1)
    relay_state1=zzio606Obj.getChannelStatus()    
    print(relay_state1)
    relay_state1=bin(ord(relay_state1.decode())).split("0b")[1]
    relay_state1='%06d' % int(relay_state1)
    print(relay_state1)
    print("Relay",{"Relay_0":relay_state1[5],"Relay_1":relay_state1[4],"Relay_2":relay_state1[3],"Relay_3":relay_state1[2],"Relay_4":relay_state1[1],"Relay_5":relay_state1[0]})
    print("----------------")


    #继电器全关闭   
    for i in range(6):
        zzio606Obj.closeChannel(i)
        utime.sleep(1)
    relay_state2=zzio606Obj.getChannelStatus()    
    print(relay_state2)
    relay_state2=bin(ord(relay_state2.decode())).split("0b")[1]
    relay_state2='%06d' % int(relay_state2)
    print(relay_state2)
    print("Relay",{"Relay_0":relay_state2[5],"Relay_1":relay_state2[4],"Relay_2":relay_state2[3],"Relay_3":relay_state2[2],"Relay_4":relay_state2[1],"Relay_5":relay_state2[0]})
    print("----------------")

    

if __name__=="__main__":
    test_zzio606()


  • app_zzio606.py
class ZZIO606(object):
    def __init__(self, mbObj, devAddr):
        self.mbObj = mbObj
        self.devAddr = devAddr

    def openChannel(self, chid):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        ret = self.mbObj.writeCoil(self.devAddr, chid, 0xff00, 200)
        return ret[0]

    def closeChannel(self, chid):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        ret = self.mbObj.writeCoil(self.devAddr, chid, 0, 200)
        return ret[0]
        
    def getChannelStatus(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        status = bytearray(1)
        ret = self.mbObj.readCoils(self.devAddr, 0, 6, status, 200)
        if ret[0] < 0:
            raise ValueError("modbus readCoils failed, errno:", ret[0])
        return status
  • board.json

{
    "version": "1.0.0",
    "io": {
          "LED11": {
            "type": "GPIO",
            "port": 36,
            "dir": "output",
            "pull": "pullup"
        },
        "modbus_485_4800":{
          "type": "MODBUS",
          "mode": 0,
          "port": 2,
          "baudrate": 4800,
          "priority": 0,
          "timeout": 200
        },
        "modbus_485_9600": {
          "type": "MODBUS",
          "mode": 0,
          "port": 2,
          "baudrate": 9600,
          "priority": 0,
          "timeout": 200
          },
      "serial1":{
        "type":"UART",
        "port":0,
        "dataWidth":8,
        "baudRate":9600,
        
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
      },
      "serial2":{
        "type":"UART",
        "port":1,
        "dataWidth":8,
        "baudRate":4800,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
      },
      "serial3":{
        "type":"UART",
        "port":2,
        "dataWidth":8,
        "baudRate":9600,
        "stopBits":1,
        "flowControl":"disable",
        "parity":"none"
      }
    },
    "debugLevel": "ERROR"
}

4.测试结果

 将6路继电器全打开,获取继电器的状态(1-开启,0-关闭),例如返回的是b’?‘。先将b’?'转化为二进制即0011 1111,然后取6位数据,即11 1111,从右往左分别是第一、二、三、四、五、六路的继电器状态。同理,将6路继电器全关闭,返回00 0000。

bytearray(b'?')   
111111
Relay {'Relay_1': '1', 'Relay_0': '1', 'Relay_3': '1', 'Relay_2': '1', 'Relay_5': '1', 'Relay_4': '1'}
----------------
bytearray(b'\x00')
000000
Relay {'Relay_1': '0', 'Relay_0': '0', 'Relay_3': '0', 'Relay_2': '0', 'Relay_5': '0', 'Relay_4': '0'}
----------------

5.参考资料

 链接: 继电器手册.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值