C#欧姆龙plc Fins Tcp通信案例上位机源码,有c#和VB的Demo,c#上位机和欧姆...
C#欧姆龙plc Fins Tcp通信案例上位机源码,有c#和VB的Demo,c#上位机和欧姆龙plc通讯案例源码,调用动态链接库,可以实现上位机的数据连接,可以简单实现D区W区定时器计数器等数据区的读写,是一个非常好的学习案例!
直接打开Visual Studio新建个Windows窗体项目,拖两个按钮和一个文本框上去。先别急着写界面逻辑,重点在后台的PLC通讯库。项目里有个OmronFinsTcp.cs文件,这货封装了FINS协议的核心操作。
连接PLC的时候要特别注意字节顺序,欧姆龙这老伙计用的大端模式。看这段连接代码:
var plc = new OmronFinsTcp();
bool isConnected = plc.Connect("192.168.250.1", 9600, 5000);
textBox1.Text = isConnected ? "握手成功" : "端口可能被占用";
那个5000毫秒超时参数实测不能小于3000,车间网络有时候波动大。连接成功后内存地址的写法有讲究,D区地址要转成十六进制,比如D100要写成0x64。写了个地址转换方法:
string ConvertAddress(PlcMemoryType type, int address)
{
return type switch
{
PlcMemoryType.DM => (address + 0x1000).ToString("X4"),
PlcMemoryType.CIO => address.ToString("D4"),
_ => throw new InvalidOperationException("未知内存区")
};
}
读写数据最怕字节顺序搞反,特别是读浮点数的时候。看这个读D区的示例:
byte[] result = plc.ReadData(PlcMemoryType.DM, 100, 2);
if (result?.Length == 4)
{
Array.Reverse(result); // 必须反转字节序
float value = BitConverter.ToSingle(result, 0);
MessageBox.Show($"D100的浮点值:{value}");
}
写计数器稍微复杂点,得先转成BCD码。比如给C0002写入值:
ushort countValue = 123;
byte[] bcdBytes = BitConverter.GetBytes((ushort)((countValue / 10 << 8) | (countValue % 10)));
plc.WriteData(PlcMemoryType.CNT, 2, bcdBytes);
项目里的VB版Demo有个隐藏坑——VB的数组索引默认从1开始,处理字节数组时要特别注意。有个哥们直接照搬C#代码结果数组越界,排查了半天。

调试时建议先拿D区试手,W区容易遇到权限问题。用Wireshark抓包看原始指令特别有用,比如正常指令应该是这样的:
80 00 02 00 01 02 03 82 00 64 00 01
突然发现某个位没写进去?八成是位地址没补零。比如要写D100.04这个位,地址字符串必须是"1000"+"04"拼成"100004",实测少个零PLC根本不认。

最后提醒:别在UI线程直接调读写方法!车间现场有的PLC响应慢,界面卡死就尴尬了。建议用BackgroundWorker或者直接上async/await,像这样:
async Task ReadPlcDataAsync()
{
byte[] data = await Task.Run(() => plc.ReadData(...));
// 更新UI...
}更多推荐

所有评论(0)