前言
工业自动化领域,PLC(可编程逻辑控制器)作为核心控制设备,广泛应用于生产线、机械臂、仓储系统等场景。而如何高效、稳定地与PLC进行通信,是实现智能化监控与远程控制的关键一步。
本文将介绍一个基于 C# 开发的欧姆龙 HostLink 协议通讯框架,详细介绍其设计思路、功能实现及实际应用效果。
项目介绍
一个轻量级但功能完整的 PLC 通信框架,专门适配欧姆龙系列 PLC,采用 HostLink 协议进行数据交互。
HostLink 是欧姆龙早期推出的一种串行通信协议,虽年代较久,但在许多老设备和特定产线中仍被广泛使用。该项目通过封装底层通信细节,提供简洁易用的 API 接口,开发可以无需深究协议细节即可快速实现读写操作。
项目功能
1、支持同步与异步读写操作,兼顾实时性与程序响应性能;
2、可读写多种数据类型,包括 int、float、byte 数组等,并通过泛型方法灵活处理;
3、支持自定义命令结构,指定操作区域(如 DM 区)、数据格式(WordHEX)及起始地址;
4、提供原始字节发送接口,便于调试或扩展非标准指令;
5、集成基础网络配置(IP、端口),适配 TCP 模式下的 HostLink 通信(部分欧姆龙设备支持)。
项目特点
1、协议兼容性:严格遵循欧姆龙HostLink协议规范,支持ASCII码帧结构与FCS校验算法;
2、异步处理机制:通过Task.Run实现非阻塞通信,提升系统吞吐量;
3、泛型支持:采用泛型方法实现int、float等多类型数据的统一读写接口;
4、错误处理:内置状态码解析模块,可识别0000(成功)、0104(数据超长)等响应码;
5、配置灵活性:支持本地IP、端口、超时时间等参数动态配置。
项目技术
技术栈涵盖 C# 8.0、WPF MVVM架构、System.IO.Ports串口通信库及欧姆龙FINS协议解析。
帧结构构造:遵循"@单元号+命令码+数据区+FCS+结束符"格式;
校验算法:采用异或运算生成FCS校验码;
异步通信:通过async/await模式实现读写操作的非阻塞执行;
数据解析:利用BitConverter实现字节流与数值类型的转换。
项目代码
同步读PLC泛型数据
private void Button_Click_ReadPLC(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
Command command = new Command(OperatorMode.Read, AreaType.DM, DataType.WordHEX, 2, 100);
var result = OrmonPlc.Read<float>(command);
if (result.Success)
{
Message message = new Message();
message.Content = $"同步读取泛型成功,读取值={result.Content},类型={result.Content.GetType().FullName}";
App.Current.Dispatcher.Invoke(() => MainViewModel.MessageList.Insert(0, message));
}
//4个字长回复 => 读两个int 或uint
//46 49 4E 53 00 00 00 1E 00 00 00 02 00 00 00 00 C0 00 02 00 34 00 00 01 00 FF 01 01 00 00 00 14 00 1E 01 02 03 04
//2个字长回复 => 读1个int 或uint 或 float
//46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 C0 00 02 00 34 00 00 01 00 FF 01 01 00 00 00 14 00 1E //if (result.Success)
//{
// Message message = new Message();
// message.Content = $"同步读取泛型成功,读取值={result.Content},类型={result.Content.GetType().FullName}";
// App.Current.Dispatcher.Invoke(() => MainViewModel.MessageList.Insert(0, message));
//}
//var result2 = OrmonPlc.ReadAsync<int>(command);
//if (result2.Result.Success)
//{
// Message message = new Message();
// message.Content = $"异步读取泛型成功,读取值={result2.Result.Content}";
// MainViewModel.MessageList.Insert(0, message);
//}
});
}
//写泛型数据
private void Button_Click_WritePLC(object sender, RoutedEventArgs e)
{
Task.Run(() =>
{
var f = BitConverter.GetBytes(10.10f);
var r = BitConverter.ToSingle(f, 0);
Command command = new Command(OperatorMode.Write, AreaType.DM, DataType.WordHEX, 10, 100);
List<float> list = new List<float>() { 255, 2.3f, 3.4f, 4.5f, 5, 6, 7, 8, 9, 10.10f };
var result = OrmonPlc.Write(command, list.ToArray());
if (result.Success)
{
MessageBox.Show("同步写入short数组成功");
}
});
}
项目效果
框架能够稳定连接欧姆龙 CJ 系列或 CP 系列 PLC(需开启 HostLink 通信功能),成功读取 DM 区寄存器数据,并写入整型或浮点数值。
项目源码
源码包含完整的解决方案结构,涵盖 PlcLib(PLC 通信核心)、CommunicationLib(通用通信组件)以及 WPF 主程序。
总结
基于欧姆龙 HostLink 协议的 C# 通信框架,虽然面向特定品牌和协议,但其设计思路具有普适参考价值:通过抽象命令、封装通信、统一返回结果,大幅降低工业通信的接入门槛。对于需要对接老旧欧姆龙设备的开发而言,它提供了一个可靠、可调试、可扩展的基础工具。

