C#与欧姆龙PLC通讯是工业自动化上位机开发中的常见需求。欧姆龙PLC支持多种通讯协议,最常用的是基于以太网的FINS协议和基于串口的Host Link协议。本文将以C#语言为核心,结合开源且成熟的HslCommunication库,演示如何通过这两种方式与欧姆龙PLC进行数据交互。无论你使用的是CP1H、CJ2M还是NJ系列PLC,本文的方法均能适配,只需调整参数即可。

准备工作与库安装
在开始编码之前,确保你的开发环境包含以下条件:
- Windows操作系统 + Visual Studio 2019或更高版本
- 项目类型:控制台应用程序或WinForms/WPF均可
- 目标框架:.NET Framework 4.6.1或.NET Core 3.1以上
然后通过NuGet安装HslCommunication库。在包管理器控制台中执行:
Install-Package HslCommunication
或者通过图形界面搜索并安装“HslCommunication”,建议使用最新稳定版本。该库支持欧姆龙PLC的FINS UDP、FINS TCP以及Host Link等协议,我们后续将分别演示。
使用FINS UDP与欧姆龙PLC通讯
FINS(Factory Interface Network Service)是欧姆龙定义的工业网络协议,可运行在UDP或TCP之上。UDP方式因效率较高,在局域网中广泛应用。下面演示如何通过FINS UDP连接PLC并读写D区数据。
连接与读写示例
using HslCommunication.Profinet.Omron;
using System;
namespace OmronPLC_Demo
{
class Program
{
static void Main(string[] args)
{
// 创建FINS UDP连接对象,参数为PLC的IP地址和端口号(默认9600)
OmronFinsUdp plc = new OmronFinsUdp("192.168.0.10", 9600);
plc.ConnectTimeOut = 2000; // 设置连接超时2秒
// 建立连接
var connectResult = plc.ConnectServer();
if (connectResult.IsSuccess)
{
Console.WriteLine("连接成功");
// 读取D100开始的5个字(16位整数)
var readResult = plc.ReadInt16("D100", 5);
if (readResult.IsSuccess)
{
Console.WriteLine("读取成功,数据:");
foreach (var val in readResult.Content)
{
Console.Write(val + " ");
}
Console.WriteLine();
}
else
{
Console.WriteLine("读取失败:" + readResult.Message);
}
// 向D200写入一个整数值1234
var writeResult = plc.Write("D200", (short)1234);
if (writeResult.IsSuccess)
{
Console.WriteLine("写入成功");
}
else
{
Console.WriteLine("写入失败:" + writeResult.Message);
}
// 关闭连接
plc.ConnectClose();
}
else
{
Console.WriteLine("连接失败:" + connectResult.Message);
}
}
}
}上述代码中,IP地址192.168.0.10需要替换为你PLC的实际IP。欧姆龙PLC默认FINS端口为9600,若不修改则保持默认。读取地址D100表示从数据存储器D100开始,连续读取5个16位整数。写入时直接使用Write方法并传入对应数据类型即可。
读取其他数据类型
HslCommunication支持多种数据类型,例如浮点数、布尔、字符串等。读取实数时需注意字节顺序。以下示例读取W区(工作区)的布尔位:
// 读取W0.00位(即W0的第0位)
var bitResult = plc.ReadBool("W0.00");
if (bitResult.IsSuccess)
{
Console.WriteLine("W0.00状态:" + (bitResult.Content ? "ON" : "OFF"));
}使用Host Link协议(串口通讯)
当以太网不可用时,许多欧姆龙PLC也支持通过串口(RS232/RS485)使用Host Link命令通讯。HslCommunication同样提供了OmronHostLink类。首先需要设置正确的串口参数,例如波特率、数据位等。
串口连接与读写
using HslCommunication.Profinet.Omron;
using System.IO.Ports;
// 创建串口对象
SerialPort sp = new SerialPort("COM3", 9600, Parity.Even, 7, StopBits.Two);
// 注意:欧姆龙Host Link通常使用Even奇偶校验、7数据位、2停止位
// 创建Host Link实例
OmronHostLink hostLink = new OmronHostLink(sp);
hostLink.ConnectTimeOut = 2000;
// 执行连接(打开串口)
var openResult = hostLink.Open();
if (openResult.IsSuccess)
{
Console.WriteLine("串口打开成功");
// 读取C100区(计数器区)当前值
var read = hostLink.Read("C100", 1);
if (read.IsSuccess)
{
Console.WriteLine("计数器C100值:" + read.Content[0]);
}
// 写入D0
hostLink.Write("D0", (short)888);
}
else
{
Console.WriteLine("打开串口失败:" + openResult.Message);
}
hostLink.Close();串口参数需与PLC侧设置完全一致。通常欧姆龙PLC的Host Link默认波特率为9600,数据位7,偶校验,2停止位。若使用RS485则可能需要额外处理地址。
常见问题与解决方案
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 连接超时 | IP地址错误,或PLC未响应 | 使用ping命令测试PLC可达性;检查PLC的FINS UDP配置是否开放 |
| 读取数据全为0或异常值 | 数据类型不匹配,或字节顺序错误 | 确认PLC中数据格式(16位/32位);尝试使用ReadInt32或ReadFloat |
| 写入无效 | 地址不可写(如输入区) | 检查PLC地址范围,D区、W区、H区可写 |
| 串口通讯乱码 | 波特率、校验位设置不一致 | 核对PLC串口参数,重新配置 |
完整项目结构与最佳实践
在实际项目中,建议将PLC通讯封装为独立的类,便于维护和复用。例如创建一个PLCController类,初始化连接,提供读取、写入等公开方法。同时添加重连机制和异常日志记录。以下是一个简单的封装示例:
using HslCommunication.Profinet.Omron;
public class PLCController : IDisposable
{
private OmronFinsUdp _plc;
public PLCController(string ipAddress, int port = 9600)
{
_plc = new OmronFinsUdp(ipAddress, port);
_plc.ConnectTimeOut = 3000;
}
public bool Connect()
{
var result = _plc.ConnectServer();
return result.IsSuccess;
}
public short[] ReadDWords(int startAddress, int length)
{
var result = _plc.ReadInt16("D" + startAddress, length);
return result.IsSuccess ? result.Content : throw new Exception(result.Message);
}
public bool WriteDWord(int address, short value)
{
var result = _plc.Write("D" + address, value);
return result.IsSuccess;
}
public void Dispose()
{
_plc?.ConnectClose();
}
}使用该封装后,主程序只需:
using (var controller = new PLCController("192.168.0.10"))
{
if (controller.Connect())
{
var data = controller.ReadDWords(100, 10);
// 处理数据...
}
}总结
通过HslCommunication库,C#与欧姆龙PLC的通讯变得非常简单。文中分别介绍了基于FINS UDP的以太网方式和基于Host Link的串口方式,并给出了可直接运行的代码实例。在实际部署时,请根据PLC型号和网络环境选择合适协议,并注意设置正确的超时和错误处理。掌握了这些方法,你就能快速开发出稳定可靠的PLC上位机应用程序。
欧姆龙PLCC#FINS协议HslCommunication读写PLC数据修改时间:2026-06-08 16:24:40