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.参考资料
链接: 继电器手册.
7217

被折叠的 条评论
为什么被折叠?



