# plc_gateway_py **Repository Path**: youngboyvip/plc_gateway_py ## Basic Information - **Project Name**: plc_gateway_py - **Description**: python版本的plc通讯库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-30 - **Last Updated**: 2026-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PLC Communication Library 轻量级工业PLC通信库,支持多种PLC品牌和协议。 ## 支持的PLC | 品牌 | 协议 | 类名 | 端口 | 适用系列 | |------|------|------|------|----------| | **Modbus TCP** | Modbus TCP | `ModbusClient` | 502 | 通用 | | **汇川 (Inovance)** | Modbus TCP | `InovanceModbusClient` | 502 | AM, H3U, H5U | | **汇川 (Inovance)** | Easy协议 | `InovanceEasyClient` | 8080 | Easy系列 | | **汇川 (Inovance)** | CIP协议 | `InovanceCipClient` | 44818 | AM800, AC800 | | **三菱 (Mitsubishi)** | Melsec MC 3E | `MitsubishiClient` | 5000 | Q/L/FX5U | | **西门子 (Siemens)** | S7 | `SiemensS7Client` | 102 | S1200/S300/S1500/S200Smart | | **欧姆龙 (Omron)** | FINS | `OmronClient` | 9600 | CJ/CS/CP | ## 安装 ```bash pip install . ``` ## 快速开始 ### Modbus TCP ```python import asyncio from plc_comm import ModbusClient async def main(): client = ModbusClient("192.168.0.100", 502) result = await client.connect() if not result.is_success: print(f"连接失败: {result.error}") return try: # 读取数据 result = await client.read_int16(100) if result.is_success: print(f"值: {result.data}") # 写入数据 await client.write_int16(200, 123) finally: await client.disconnect() asyncio.run(main()) ``` ### 汇川PLC (Modbus TCP) ```python import asyncio from plc_comm import InovanceModbusClient, InovanceSeries async def main(): # AM系列 client = InovanceModbusClient( "192.168.0.100", 502, series=InovanceSeries.AM ) result = await client.connect() if not result.is_success: print(f"连接失败: {result.error}") return try: # 读取数据 result = await client.read_int16("D100") if result.is_success: print(f"D100: {result.data}") result = await client.read_float("D200") if result.is_success: print(f"D200: {result.data}") # 写入数据 await client.write_int16("D100", 123) await client.write_float("D200", 3.14) finally: await client.disconnect() asyncio.run(main()) ``` ### 汇川PLC (Easy协议) ```python import asyncio from plc_comm import InovanceEasyClient async def main(): client = InovanceEasyClient("192.168.0.100", 8080) result = await client.connect() if not result.is_success: print(f"连接失败: {result.error}") return try: # 读取数据 result = await client.read_int16("D100") if result.is_success: print(f"D100: {result.data}") # 写入数据 await client.write_int16("D100", 123) finally: await client.disconnect() asyncio.run(main()) ``` ### 汇川PLC (CIP协议) ```python import asyncio from plc_comm import InovanceCipClient async def main(): client = InovanceCipClient("192.168.0.100", 44818) result = await client.connect() if not result.is_success: print(f"连接失败: {result.error}") return try: # 读取标签 result = await client.read_int16("TagName") if result.is_success: print(f"TagName: {result.data}") # 读取数组元素 result = await client.read_int16("TagName[0]") if result.is_success: print(f"TagName[0]: {result.data}") # 写入标签 await client.write_int16("TagName", 123) await client.write_float("FloatTag", 3.14) finally: await client.disconnect() asyncio.run(main()) ``` ### 三菱PLC ```python import asyncio from plc_comm import MitsubishiClient async def main(): client = MitsubishiClient("192.168.0.100", 5000) result = await client.connect() if not result.is_success: print(f"连接失败: {result.error}") return try: # 读取数据 result = await client.read_int16("D100") if result.is_success: print(f"D100: {result.data}") result = await client.read_int32("D200") if result.is_success: print(f"D200: {result.data}") # 写入数据 await client.write_int16("D100", 123) await client.write_int32("D200", 456) finally: await client.disconnect() asyncio.run(main()) ``` ### 西门子PLC ```python import asyncio from plc_comm import SiemensS7Client, SiemensPLCS async def main(): client = SiemensS7Client( SiemensPLCS.S1200, "192.168.0.100", 102 ) result = await client.connect() if not result.is_success: print(f"连接失败: {result.error}") return try: # 读取数据 result = await client.read_int16("M100") if result.is_success: print(f"M100: {result.data}") result = await client.read_int32("DB20.100") if result.is_success: print(f"DB20.100: {result.data}") # 写入数据 await client.write_int16("M100", 123) finally: await client.disconnect() asyncio.run(main()) ``` ### 欧姆龙PLC ```python import asyncio from plc_comm import OmronClient async def main(): client = OmronClient("192.168.0.100", 9600) result = await client.connect() if not result.is_success: print(f"连接失败: {result.error}") return try: # 读取数据 result = await client.read_int16("D100") if result.is_success: print(f"D100: {result.data}") # 写入数据 await client.write_int16("D100", 123) finally: await client.disconnect() asyncio.run(main()) ``` ## API文档 ### 汇川PLC地址格式 #### AM系列 (AM400, AM400_800, AC800) | 地址类型 | 格式 | 说明 | |----------|------|------| | 输出继电器 | `Q100` | 输出点 | | 输入继电器 | `I100` | 输入点 | | 内部继电器 | `M100` | 内部继电器 | | 字寄存器 | `MW100` | 字寄存器 | | 双字寄存器 | `MD100` | 双字寄存器 | | 字节寄存器 | `MB100` | 字节寄存器 | | 位寄存器 | `MX100.0` | 位访问 | | 特殊继电器 | `SM100` | 特殊继电器 | | 特殊寄存器 | `SD100` | 特殊寄存器 | #### H3U系列 | 地址类型 | 格式 | 说明 | |----------|------|------| | 输入点 | `X0` | 八进制 | | 输出点 | `Y0` | 八进制 | | 内部继电器 | `M100` | 内部继电器 | | 状态继电器 | `S100` | 状态继电器 | | 定时器 | `T100` | 定时器 | | 计数器 | `C100` | 计数器 | | 数据寄存器 | `D100` | 数据寄存器 | | 特殊寄存器 | `SD100` | 特殊寄存器 | | 文件寄存器 | `R100` | 文件寄存器 | #### H5U系列 | 地址类型 | 格式 | 说明 | |----------|------|------| | 输入点 | `X0` | 八进制 | | 输出点 | `Y0` | 八进制 | | 状态继电器 | `S100` | 状态继电器 | | 链接继电器 | `B100` | 链接继电器 | | 内部继电器 | `M100` | 内部继电器 | | 数据寄存器 | `D100` | 数据寄存器 | | 文件寄存器 | `R100` | 文件寄存器 | ### 三菱PLC地址格式 | 地址类型 | 格式 | 说明 | |----------|------|------| | 输入继电器 | `X0` | 八进制 | | 输出继电器 | `Y0` | 八进制 | | 内部继电器 | `M100` | 内部继电器 | | 锁存继电器 | `L100` | 锁存继电器 | | 数据寄存器 | `D100` | 数据寄存器 | | 链接寄存器 | `W100` | 链接寄存器 | | 文件寄存器 | `R100` | 文件寄存器 | | 定时器 | `T100` | 定时器 | | 计数器 | `C100` | 计数器 | ### 西门子PLC地址格式 | 地址类型 | 格式 | 说明 | |----------|------|------| | 输入 | `I100` | 输入区 | | 输出 | `Q100` | 输出区 | | 位存储区 | `M100` | 位存储区 | | 数据块 | `DB20.100` | 数据块 | | 定时器 | `T100` | 定时器 | | 计数器 | `C100` | 计数器 | ### CIP协议数据类型 ```python from plc_comm import CipDataType # 支持的数据类型 CipDataType.BOOL # 0xC1 - 位类型 CipDataType.SINT # 0xC2 - 8位整型 CipDataType.INT # 0xC3 - 16位整型 CipDataType.DINT # 0xC4 - 32位整型 CipDataType.LINT # 0xC5 - 64位整型 CipDataType.USINT # 0xC6 - 无符号8位 CipDataType.UINT # 0xC7 - 无符号16位 CipDataType.UDINT # 0xC8 - 无符号32位 CipDataType.ULINT # 0xC9 - 无符号64位 CipDataType.REAL # 0xCA - 单精度浮点 CipDataType.DOUBLE # 0xCB - 双精度浮点 CipDataType.STRING # 0xD0 - 字符串 CipDataType.BYTE # 0xD1 - 字节数组 CipDataType.WORD # 0xD2 - 字数组 CipDataType.DWORD # 0xD3 - 双字数组 ``` ## 项目结构 ``` plc_comm/ ├── __init__.py # 包入口 ├── core/ │ ├── __init__.py # 核心模块 │ ├── result.py # Result dataclass │ ├── byte_convert.py # 字节转换函数 │ └── tcp_client.py # TCP基础客户端 └── plc/ ├── __init__.py # PLC客户端导出 ├── modbus.py # Modbus TCP ├── inovance.py # 汇川Modbus/Easy ├── inovance_cip.py # 汇川CIP ├── mitsubishi.py # 三菱Melsec ├── siemens.py # 西门子S7 └── omron.py # 欧姆龙FINS ``` ## 许可证 MIT License