Initial commit

This commit is contained in:
Junhan Chang
2025-04-17 15:19:47 +08:00
parent a47a3f5c3a
commit c78ac482d8
262 changed files with 39871 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
import time
from pymodbus.client import ModbusTcpClient
from unilabos.device_comms.modbus_plc.node.modbus import Coil, HoldRegister
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian
# client = ModbusTcpClient('localhost', port=5020)
client = ModbusTcpClient('192.168.3.2', port=502)
client.connect()
coil1 = Coil(client=client, name='coil_test1', data_type=bool, address=4502*8)
coil1.write(True)
time.sleep(3)
coil1.write(False)
coil1 = Coil(client=client, name='coil_test1', data_type=bool, address=4503*8)
coil1.write(True)
time.sleep(3)
coil1.write(False)
exit(0)
register1 = HoldRegister(client=client, name="test-1", address=7040)
coil1 = Coil(client=client, name='coil_test1', address=7002*8)
coil1.write(True)
while True:
# result = client.read_holding_registers(address=7040, count=2, slave=1) # unit=1 是从站地址
result = register1.read(2, slave=1)
if result.isError():
print("读取失败")
else:
print("读取成功:", result.registers)
decoder = BinaryPayloadDecoder.fromRegisters(
result.registers, byteorder=Endian.BIG, wordorder=Endian.LITTLE
)
real_value = decoder.decode_32bit_float()
print("这里的值是: ", real_value)
if real_value > 42:
coil1.write(False)
break
time.sleep(1)
# # 创建 Modbus TCP 客户端,连接到本地模拟的服务器
# client = ModbusClient('localhost', port=5020)
# # 连接到服务器
# # 读取保持寄存器(地址 0读取 10 个寄存器)
# # address: int,
# # *,
# # count: int = 1,
# # slave: int = 1,
# response = client.read_holding_registers(
# address=0, count=10, slave=1
# )
# response = coil1.read(2, slave=1)
#
# if response.isError():
# print(f"Error reading registers: {response}")
# else:
# print(f"Read holding registers: {response.bits}")
#
# coil1.write(1, slave=1)
# print("Wrote value 1234 to holding register 0")
#
# response = coil1.read(2, slave=1)
# if response.isError():
# print(f"Error reading registers: {response}")
# else:
# print(f"Read holding registers after write: {response.bits}")
#
#
# if response.isError():
# print(f"Error reading registers: {response}")
# else:
# print(f"Read holding registers after write: {response.bits}")
client.close()
# # 写入保持寄存器(地址 0值为 1234
# client.write_register(0, 1234, slave=1)
# print("Wrote value 1234 to holding register 0")
# # 再次读取寄存器,确认写入成功
# response = client.read_holding_registers(address=0, count=10, slave=1)
# if response.isError():
# print(f"Error reading registers: {response}")
# else:
# print(f"Read holding registers after write: {response.registers}")
# # 关闭连接
# client.close()

View File

@@ -0,0 +1,45 @@
# coding=utf-8
from pymodbus.client import ModbusTcpClient
from unilabos.device_comms.modbus_plc.node.modbus import Coil
import time
client = ModbusTcpClient('192.168.3.2', port=502)
client.connect()
coil1 = Coil(client=client, name='0', address=7012*8)
coil2 = Coil(client=client, name='0', address=7062*8)
coil3 = Coil(client=client, name='0', address=7054*8)
while True:
time.sleep(1)
resp, isError = coil2.read(1)
resp1, isError = coil3.read(1)
print(resp[0], resp1[0])
# hr = HoldRegister(client, '1', 100)
# resp = hr.write([666.3, 777.4], data_type=DATATYPE.FLOAT32, word_order=WORDORDER.BIG)
# print('write ===== hr1', resp)
# time.sleep(1)
# h_resp = hr.read(4, data_type=DATATYPE.FLOAT32, word_order=WORDORDER.BIG)
# print('=======hr1', h_resp)
#
#
# resp = hr.write([666, 777], data_type=DATATYPE.INT32, word_order=WORDORDER.BIG)
# print('write ===== hr1', resp)
# time.sleep(1)
# h_resp = hr.read(4, data_type=DATATYPE.INT32, word_order=WORDORDER.BIG)
# print('=======hr1', h_resp)
#
#
# resp = hr.write('hello world!', data_type=DATATYPE.STRING, word_order=WORDORDER.BIG)
# print('write ===== hr1', resp)
# time.sleep(1)
# h_resp = hr.read(12, data_type=DATATYPE.STRING, word_order=WORDORDER.BIG)
# print('=======hr1', h_resp)

View File

@@ -0,0 +1,42 @@
import modbus_tk.modbus_tcp as modbus_tcp
import modbus_tk.defines as cst
from modbus_tk.modbus import Slave
# 创建一个 Modbus TCP 服务器
server = modbus_tcp.TcpServer(
address="localhost", port=5020, timeout_in_sec=1
)
# 设置服务器的地址和端口
# server.set_address("localhost", 5020) # 监听在本地端口5020
# 添加一个从设备Slave ID 设为 1
slave: Slave = server.add_slave(1)
# 向从设备添加一个保持寄存器块假设从地址0开始10个寄存器
# def add_block(self, block_name, block_type, starting_address, size)
# slave.add_block('0', cst.HOLDING_REGISTERS, 0, 10)
# 添加一个线圈
# 0 名字, 从 16 字节内存位置开始,分配连续两个字节的内存大小,注意地址只能是 8 的整数倍
slave.add_block('0', cst.COILS, 2*8, 2)
# 1 名字100 起始地址, 8 是从 100 的位置分配 8 个字节内存, 两个线圈的量
slave.add_block('1', cst.HOLDING_REGISTERS, 100, 8)
slave.add_block('2', cst.HOLDING_REGISTERS, 200, 16)
# slave.add_block('2', cst.DISCRETE_INPUTS , 200, 2)
# slave.add_block('3', cst.ANALOG_INPUTS , 300, 2)
# 启动服务器
server.start()
print("Modbus TCP server running on localhost:5020")
# 保持服务器运行,直到按下 Ctrl+C
try:
while True:
pass
except KeyboardInterrupt:
server.stop()
print("Server stopped.")

View File

@@ -0,0 +1,168 @@
import time
from typing import Callable
from unilabos.device_comms.modbus_plc.client import TCPClient, ModbusWorkflow, WorkflowAction, load_csv
from unilabos.device_comms.modbus_plc.node.modbus import Base as ModbusNodeBase
############ 第一种写法 ##############
# modbus_tcp_client_test1 = TCPClient('192.168.3.2', 502)
#
#
# node_list = [
# ModbusNode(name="left_move_coli", device_type=DeviceType.COIL, address=7003 * 8),
# ModbusNode(name="right_move_coli", device_type=DeviceType.COIL, address=7002 * 8),
# ModbusNode(name="position_register", device_type=DeviceType.HOLD_REGISTER, address=7040),
# ]
#
# def judge_position(node: ModbusNodeBase):
# idx = 0
# while idx <= 5:
# result, is_err = node.read(2)
# if is_err:
# print("读取失败")
# else:
# print("读取成功:", result)
# idx+=1
# time.sleep(1)
#
# workflow_move_2_right = PLCWorkflow(name="测试水平向右移动", actions=[
# lambda use_node: use_node('left_move_coli').write(False),
# lambda use_node: use_node('right_move_coli').write(True),
# lambda use_node: judge_position(use_node('position_register')),
# lambda use_node: use_node('right_move_coli').write(False),
# ])
#
#
# workflow_move_2_left = PLCWorkflow(name="测试水平向左移动", actions=[
# lambda use_node: use_node('right_move_coli').write(False),
# lambda use_node: use_node('left_move_coli').write(True),
# lambda use_node: judge_position(use_node('position_register')),
# lambda use_node: use_node('left_move_coli').write(False),
# ])
#
#
# workflow_test_1 = PLCWorkflow(name="测试水平移动并停止", actions=[
# workflow_move_2_right,
# workflow_move_2_left,
# ])
#
# modbus_tcp_client_test1 \
# .register_node_list(node_list) \
# .run_plc_workflow(workflow_test_1)
#
############ 第二种写法 ##############
modbus_tcp_client_test2 = TCPClient('192.168.3.2', 502)
# def judge_position(node: ModbusNodeBase):
# idx = 0
# while idx <= 5:
# result, is_err = node.read(2)
# if is_err:
# print("读取失败")
# else:
# print("读取成功:", result)
# idx+=1
# time.sleep(1)
# def move_2_right_init(use_node: Callable[[str], ModbusNodeBase]) -> bool:
# use_node('left_move_coli').write(False)
# use_node('right_move_coli').write(True)
# return True
# def move_2_right_start(use_node: Callable[[str], ModbusNodeBase]) -> bool:
# judge_position(use_node('position_register'))
# return True
# def move_2_right_stop(use_node: Callable[[str], ModbusNodeBase]) -> bool:
# use_node('right_move_coli').write(False)
# return True
# move_2_right_workflow = ModbusWorkflow(name="测试水平向右移动", actions=[WorkflowAction(
# init=move_2_right_init,
# start=move_2_right_start,
# stop=move_2_right_stop,
# )])
# move_2_right_workflow = ModbusWorkflow(name="测试水平向右移动", actions=[WorkflowAction(
# init=move_2_right_init,
# start= None,
# stop= None,
# cleanup=None,
# )])
def idel_init(use_node: Callable[[str], ModbusNodeBase]) -> bool:
# 修改速度
use_node('M01_idlepos_velocity_rw').write(20.0)
# 修改位置
# use_node('M01_idlepos_position_rw').write(35.22)
return True
def idel_position(use_node: Callable[[str], ModbusNodeBase]) -> bool:
use_node('M01_idlepos_coil_w').write(True)
while True:
pos_idel, idel_err = use_node('M01_idlepos_coil_r').read(1)
pos_stop, stop_err = use_node('M01_manual_stop_coil_r').read(1)
time.sleep(0.5)
if not idel_err and not stop_err and pos_idel[0] and pos_stop[0]:
break
return True
def idel_stop(use_node: Callable[[str], ModbusNodeBase]) -> bool:
use_node('M01_idlepos_coil_w').write(False)
return True
move_idel= ModbusWorkflow(name="测试待机位置", actions=[WorkflowAction(
init=idel_init,
start=idel_position,
stop=idel_stop,
)])
def pipetter_init(use_node: Callable[[str], ModbusNodeBase]) -> bool:
# 修改速度
# use_node('M01_idlepos_velocity_rw').write(10.0)
# 修改位置
# use_node('M01_idlepos_position_rw').write(35.22)
return True
def pipetter_position(use_node: Callable[[str], ModbusNodeBase]) -> bool:
use_node('M01_pipette0_coil_w').write(True)
while True:
pos_idel, isError = use_node('M01_pipette0_coil_r').read(1)
pos_stop, isError = use_node('M01_manual_stop_coil_r').read(1)
time.sleep(0.5)
if pos_idel[0] and pos_stop[0]:
break
return True
def pipetter_stop(use_node: Callable[[str], ModbusNodeBase]) -> bool:
use_node('M01_pipette0_coil_w').write(False)
return True
move_pipetter= ModbusWorkflow(name="测试待机位置", actions=[WorkflowAction(
init=None,
start=pipetter_position,
stop=pipetter_stop,
)])
workflow_test_2 = ModbusWorkflow(name="测试水平移动并停止", actions=[
move_idel,
move_pipetter,
])
nodes = load_csv('/Users/dingshinn/Desktop/lbg/uni-lab/M01.csv')
modbus_tcp_client_test2 \
.register_node_list(nodes) \
.run_modbus_workflow(workflow_test_2)
# .run_modbus_workflow(move_2_left_workflow)