MIT License

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

对 IoTClient 项目的深度技术分析

项目背景与痛点

随着物联网技术的成熟与应用的普及,各类型工业设备之间的数据通信变得越发重要。zhaopeiym/IoTClient 正是在这一需求的推动下开发而成,它专注于提供一个统一的协议栈,实现PLC、ModBus和Bacnet等工业协议的通信能力。这打破了工业设备的异构性所带来的通信壁垒,为整合各类设备数据提供了可能性。

核心技术揭秘

zhaopeiym/IoTClient 通过采用模块化的设计模式有效地将不同的通信协议封装在不同的组件中,每一个组件都负责特定协议的实现,比如ModBus协议和Bacnet协议。这样的设计不仅有助于维护代码库,还便于为特定协议扩展或修复功能。在核心架构上,IoTClient 使用流式数据处理和事件驱动的异步通信策略,确保高效的实时数据交换。

数据流架构图

graph LR A[User Request] --> B[Protocol Parser] B --> C{"Protocol Type?"} C -->|"Modbus"| D[Modbus Handler] C -->|"Bacnet"| E[Bacnet Handler] D --> F[Device Request] E --> F F --> G[Device Response] G --> H[Protocol Encoder] H --> I[User Response]

功能亮点与差异

相比于其他工业通信实现库,如libmodbus和LibBacnet,zhaopeiym/IoTClient提供了更为用户友好的接口,允许开发者快速集成。其开放的架构设计则让社区贡献者能够更容易地添加新的协议支持,且不改变核心代码。此外,基于MIT许可证的免费与无限期限使用权限,极大地降低了软件的使用门槛。

应用场景与落地建议

该组件适合于嵌入式系统、智能家居以及工业自动化等领域。在部署过程中,应该注意协议库与特定硬件的兼容性。同时,对于要求实时性能敏感的应用场景,开发者需要更为仔细地评估协议栈在具体硬件上的表现。例如,确保其足够快速地处理并发通信,保证数据交换的一致性和准确性。

综合评价

优点:模块化设计与易集成接口,使得扩展协议栈更加容易;开放的社区许可,便于更广泛的商业和技术发展。
缺点:作为新项目,其稳定性和广泛性可能不如专有或更成熟的组件。未来需要更多用户实践和社区反馈,进一步提高代码库的稳定性和功能多样性。

关于

GitHub 原始描述(英文)

This is an IoT device communication protocol implementation client, which will include common industrial communication protocols such as mainstream PLC communication reading, ModBus protocol, and Bacnet protocol. This component is open source and free for life, using the most relaxed MIT open source agreement, you can modify and commercial use at will (commercial use please evaluate and test). 这是一个物联网设备通讯协议实现客户端,将会包括主流PLC通信读取、ModBus协议、Bacnet协议等常用工业通讯协议。本组件终身开源免费,采用最宽松的MIT开源协议,您可以随意修改和商业使用(商业使用请做好评估和测试)。

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

语言占比

C#

Release

贡献者

README

IoTClient

English | 中文文档

image image image

  • This is an IoT device communication protocol realization client, which will include mainstream PLC communication reading, ModBus protocol, Bacnet protocol and other common industrial communication protocols.
  • This component is based on .NET Standard 2.0 and can be used for cross-platform development of .Net, such as Windows, Linux and even run on Raspberry Pi.
  • This component is open source and free for life, and adopts the most relaxed MIT protocol. You can also modify and use it for commercial use (commercial use please evaluate and test).
  • Development tools:Visual Studio 2019
  • QQ exchange group:700324594

Document directory

Instructions for use

Reference component

Nuget installation Install-Package IoTClient
Or graphical installation
image

ModBusTcp read and write operations

//1、Instantiate the client-enter the correct IP and port
ModBusTcpClient client = new ModBusTcpClient("127.0.0.1", 502);

//2、Write operation-parameters are: address, value, station number, function code
client.Write("4", (short)33, 2, 16);

//2.1、[Note] When writing data, you need to clarify the data type
client.Write("0", (short)33, 2, 16);    //Write short type value
client.Write("4", (ushort)33, 2, 16);   //Write ushort type value
client.Write("8", (int)33, 2, 16);      //Write int type value
client.Write("12", (uint)33, 2, 16);    //Write uint type value
client.Write("16", (long)33, 2, 16);    //Write long type value
client.Write("20", (ulong)33, 2, 16);   //Write ulong type value
client.Write("24", (float)33, 2, 16);   //Write float type value
client.Write("28", (double)33, 2, 16);  //Write double type value
client.Write("32", true, 2, 5);         //Write Coil type value
client.Write("100", "orderCode", stationNumber);  //Write string

//3、Read operation-the parameters are: address, station number, function code
var value = client.ReadInt16("4", 2, 3).Value;

//3.1、Other types of data reading
client.ReadInt16("0", stationNumber, 3);    //short type data read
client.ReadUInt16("4", stationNumber, 3);   //ushort type data read
client.ReadInt32("8", stationNumber, 3);    //int type data read
client.ReadUInt32("12", stationNumber, 3);  //uint type data read
client.ReadInt64("16", stationNumber, 3);   //long type data read
client.ReadUInt64("20", stationNumber, 3);  //ulong type data read
client.ReadFloat("24", stationNumber, 3);   //float type data read
client.ReadDouble("28", stationNumber, 3);  //double type data read
client.ReadCoil("32", stationNumber, 1);    //Coil type data read
client.ReadDiscrete("32", stationNumber, 2);//Discrete type data read
client.ReadString("100", stationNumber,readLength:10); //Read string

//4、If there is no active Open, it will automatically open and close the connection every time you read and write operations, which will greatly reduce the efficiency of reading and writing. So it is recommended to open and close manually.
client.Open();

//5、Read and write operations will return the operation result object Result
var result = client.ReadInt16("4", 2, 3);
//5.1 Whether the reading is successful (true or false)
var isSucceed = result.IsSucceed;
//5.2 Exception information for failed reading
var errMsg = result.Err;
//5.3 Read the request message actually sent by the operation
var requst  = result.Requst;
//5.4 Read the response message from the server
var response = result.Response;
//5.5 Read value
var value3 = result.Value;

//6、Batch read
var list = new List<ModBusInput>();
list.Add(new ModBusInput()
{
    Address = "2",
    DataType = DataTypeEnum.Int16,
    FunctionCode = 3,
    StationNumber = 1
});
list.Add(new ModBusInput()
{
    Address = "2",
    DataType = DataTypeEnum.Int16,
    FunctionCode = 4,
    StationNumber = 1
});
list.Add(new ModBusInput()
{
    Address = "199",
    DataType = DataTypeEnum.Int16,
    FunctionCode = 3,
    StationNumber = 1
});
var result = client.BatchRead(list);

//7、Other parameters of the constructor
//IP, port, timeout time, big and small end settings
ModBusTcpClient client = new ModBusTcpClient("127.0.0.1", 502, 1500, EndianFormat.ABCD);

For more usage of ModBusTcp, please refer to Unit Test

ModBusRtu read and write operations

//Instantiate the client-[COM port name, baud rate, data bits, stop bits, parity]
ModBusRtuClient client = new ModBusRtuClient("COM3", 9600, 8, StopBits.One, Parity.None);

//Other read and write operations are the same as ModBusTcpClient's read and write operations

ModBusAscii read and write operations

//Instantiate the client-[COM port name, baud rate, data bits, stop bits, parity]
ModbusAsciiClient client = new ModbusAsciiClient("COM3", 9600, 8, StopBits.One, Parity.None);

//Other read and write operations are the same as ModBusTcpClient's read and write operations

ModbusRtuOverTcp read and write operations

//Serial port transparent transmission i.e.: send Rtu format messages in Tcp mode

//Instantiate the client-IP, port, timeout, big and small end settings
ModbusRtuOverTcpClient client = new ModbusRtuOverTcpClient("127.0.0.1", 502, 1500, EndianFormat.ABCD);

//Other read and write operations are the same as ModBusTcpClient's read and write operations

SiemensClient (Siemens) read and write operations

//1、Instantiate the client-enter the model, IP and port
//Other models:SiemensVersion.S7_200、SiemensVersion.S7_300、SiemensVersion.S7_400、SiemensVersion.S7_1200、SiemensVersion.S7_1500
SiemensClient client = new SiemensClient(SiemensVersion.S7_200Smart, "127.0.0.1",102);

//2、Write operation
client.Write("Q1.3", true);
client.Write("V2205", (short)11);
client.Write("V2209", 33);

//3、Read operation
var value1 = client.ReadBoolean("Q1.3").Value;
var value2 = client.ReadInt16("V2205").Value;
var value3 = client.ReadInt32("V2209").Value;

//4、If there is no active Open, it will automatically open and close the connection every time you read and write operations, which will greatly reduce the efficiency of reading and writing. So it is recommended to open and close manually.
client.Open();

//5、Read and write operations will return the operation result object Result
var result = client.ReadInt16("V2205");
//5.1 Whether the reading is successful (true or false)
var isSucceed = result.IsSucceed;
//5.2 Exception information for failed reading
var errMsg = result.Err;
//5.3 Read the request message actually sent by the operation
var requst  = result.Requst;
//5.4 Read the response message from the server
var response = result.Response;
//5.5 Read value
var value4 = result.Value;

Note: About Siemens PLC address

VB263、VW263、VD263中的B、W、D分别表示:byte型(8位)、word型(16位)、doubleword型(32位)。

When this component passes in the address, there is no need to carry the data type, just use the corresponding method to read the corresponding type, such as:
VB263       - client.ReadByte("V263")
VD263       - client.ReadFloat("V263")
VD263       - client.ReadInt32("V263")
DB108.DBW4  - client.ReadUInt16("DB108.4")
DB1.DBX0.0  - client.ReadBoolean("DB1.0.0")
DB1.DBD0    - client.ReadFloat("DB1.0")
C# data type smart200 1200/1500/300
bit V1.0 DB1.DBX1.0
byte VB1 DB1.DBB1
shor
ushort
VW2 DB1.DBW2
int
uint
float
VD4 DB1.DBD4

SiemensClient best practices

1、When not to take the initiative to open
Siemens plc generally allows up to 8 long connections. So when the number of connections is not enough or when doing testing, do not take the initiative to open, so that the component will automatically open and close immediately.

2、When to take the initiative to open
When the number of long connections is enough, and you want to improve the read and write performance.

3、In addition to active Open connections, batch read and write can also greatly improve read and write performance.
//Batch read
Dictionary<string, DataTypeEnum> addresses = new Dictionary<string, DataTypeEnum>();
addresses.Add("DB4.24", DataTypeEnum.Float);
addresses.Add("DB1.434.0", DataTypeEnum.Bool);
addresses.Add("V4109", DataTypeEnum.Byte);
...
var result = client.BatchRead(addresses);

//Batch write
Dictionary<string, object> addresses = new Dictionary<string, object>();
addresses.Add("DB4.24", (float)1);
addresses.Add("DB4.0", (float)2);
addresses.Add("DB1.434.0", true);
...
var result = client.BatchWrite(addresses);

4、[Note] When writing data, you need to clarify the data type
client.Write("DB4.12", 9);          //What is written is of type int
client.Write("DB4.12", (float)9);   //What is written is a float type

5、SiemensClient is a thread safe class
Due to limited long PLC connections, SiemensClient is designed as a thread-safe class. You can set SiemensClient as a singleton, and use the instance of SiemensClient to read and write PLC between multiple threads.

MitsubishiClient (Mitsubishi) read and write operations

//1、Instantiate the client-enter the correct IP and port
MitsubishiClient client = new MitsubishiClient(MitsubishiVersion.Qna_3E, "127.0.0.1",6000);

//2、Write operation
client.Write("M100", true);
client.Write("D200", (short)11);
client.Write("D210", 33);

//3、Read operation
var value1 = client.ReadBoolean("M100").Value;
var value2 = client.ReadInt16("D200").Value;
var value3 = client.ReadInt32("D210").Value;

//4、If there is no active Open, it will automatically open and close the connection every time you read and write operations, which will greatly reduce the efficiency of reading and writing. So it is recommended to open and close manually.
client.Open();

//5、Read and write operations will return the operation result object Result
var result = client.ReadInt16("D210");
//5.1 Whether the reading is successful (true or false)
var isSucceed = result.IsSucceed;
//5.2 Exception information for failed reading
var errMsg = result.Err;
//5.3 Read the request message actually sent by the operation
var requst  = result.Requst;
//5.4 Read the response message from the server
var response = result.Response;
//5.5 Read value
var value4 = result.Value;

OmronFinsClient (Omron) read and write operations

//1、Instantiate the client-enter the correct IP and port
OmronFinsClient client = new OmronFinsClient("127.0.0.1",6000);

//2、Write operation
client.Write("M100", true);
client.Write("D200", (short)11);
client.Write("D210", 33);

//3、Read operation
var value1 = client.ReadBoolean("M100").Value;
var value2 = client.ReadInt16("D200").Value;
var value3 = client.ReadInt32("D210").Value;

//4、If there is no active Open, it will automatically open and close the connection every time you read and write operations, which will greatly reduce the efficiency of reading and writing. So it is recommended to open and close manually.
client.Open();

//5、Read and write operations will return the operation result object Result
var result = client.ReadInt16("D210");
//5.1 Whether the reading is successful (true or false)
var isSucceed = result.IsSucceed;
//5.2 Exception information for failed reading
var errMsg = result.Err;
//5.3 Read the request message actually sent by the operation
var requst  = result.Requst;
//5.4 Read the response message from the server
var response = result.Response;
//5.5 Read value
var value4 = result.Value;

AllenBradleyClient read and write operations

//1、Instantiate the client-enter the correct IP and port
AllenBradleyClient client = new AllenBradleyClient("127.0.0.1",44818);

//2、Write operation 
client.Write("A1", (short)11); 

//3、Read operation
var value = client.ReadInt16("A1").Value;

//4、If there is no active Open, it will automatically open and close the connection every time you read and write operations, which will greatly reduce the efficiency of reading and writing. So it is recommended to open and close manually.
client.Open();

//5、Read and write operations will return the operation result object Result
var result = client.ReadInt16("A1");
//5.1 Whether the reading is successful (true or false)
var isSucceed = result.IsSucceed;
//5.2 Exception information for failed reading
var errMsg = result.Err;
//5.3 Read the request message actually sent by the operation
var requst  = result.Requst;
//5.4 Read the response message from the server
var response = result.Response;
//5.5 Read value
var value4 = result.Value;

Some projects based on IoTClient library

IoTClient Tool Desktop program tool (open source)

IoTClient Tool 桌面程序工具,开源地址。

  • 1、可用来测试PLC和相关协议的通信
  • 2、可作为IoTClient库使用例子。

image

image

image

image

image

image

image

image

image

image

Energy Management System (Commercial)

能源管理-现场-单项目

image
image

能源管理-云端-多项目

image
image
image
image
image
image
image

能源管理-移动端

imageimageimageimageimageimageimage

Haidilao terminal control (commercial)

海底捞末端控制-web

image
image
image
image

海底捞末端控制-移动端

imageimageimageimage

评论

暂无评论