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...
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐