C#使用欧姆龙PLC的Fins协议读写PLC地址(基本封装)

本文详细介绍了FINS通信协议,欧姆龙公司开发的用于工业自动化控制网络的指令响应系统,包括握手过程、读写指令示例和C#封装程序。通过实例演示了如何使用FINS-TCP连接PLC,以及如何执行位操作和字操作来读写PLC数据区。

FINS通讯概述

FINS(factory interface network service)通信协议是欧姆龙公司开发的用于工业自动化控制网络的指令/响应系统。运用 FINS指令可实现各种网络间的无缝通信,通过编程发送FINS指令,上位机或PLC就能够读写另一个PLC数据区的内容,甚至控制其运行状态,从而简化了用户程序。FINS协议支持工业以太网,这就为OMRON PLC与上位机以太网通信的实现提供了途径。

FINS-TCP需要握手命令成功后方可真正连接上PLC。

以下命令均为十六进制 字节数据流:

1. 握手指令

1.1. 发送

46494E53 0000000C 00000000 00000000 00000018

46494E53:ASCII编码:FINS;

0000000C:指后面跟的字节长度;12个字节

00000000:固定命令;

00000000:错误代码;

00000018:PC节点IP,当设置为0时,会自动获取节点IP。

1.2. 反馈

46494E53 00000010 00000001 00000000 00000018 00000017

46494E53:ASCII编码:FINS;

00000010:指后面跟的字节长度;16个字节

00000001:固定命令;

00000000:错误代码;

00000018:本机电脑节点IP;

00000017:PLC节点IP。

2. 读取指令

读D100开始的2个地址,注:一次最多读1000个地址【以字为单位,也就是2000个字节】。

2.1. 发送

46494E53 0000001A 00000002 00000000 80 00 02 001700 001800 FF 0101 82 006400 0002

46494E53:ASCII编码:FINS;

0000001A:指后面跟的字节长度;26个字节

00000002:固定命令;

00000000:错误代码;

80:ICF;

00:RSV;

02:GCT;

00:PLC网络地址;

17:PLC节点地址;

00:PLC单元地址;

00:PC网络地址;

18:PC节点地址;

00:PC单元地址;

FF:SID;

0101:读指令;

82:读地址区(D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0);

006400:起始地址;

0002:读个数。读取字【WORD】个数,也就是【WORD*2】个字节

2.2. 反馈

46494E53 0000001A 00000002 00000000 C0 00 02 001800 001700 FF 0101 0000 AABB CCDD

46494E53:ASCII编码:FINS;

0000001A:指后面跟的字节长度;

00000002:固定命令;

00000000:错误代码;

C0:ICF;

00:RSV;

02:GCT;

00:PC网络地址;

18:PC节点地址;

00:PC单元地址;

00:PLC网络地址;

17:PLC节点地址;

00:PLC单元地址;

FF:SID;

0101:读指令;

0000:读取成功标识;

AABB CCDD:读到的数据。

3. 写入指令

往W10,W11写入AABB,CCDD

3.1. 发送

46494E53 0000001E 00000002 00000000 80 00 02 001700 001800 FF 0102 B1 000A00 0002 AABBCCDD

46494E53:ASCII编码:FINS;

0000001E:指后面跟的字节长度;

00000002:固定命令;

00000000:错误代码;

80:ICF;

00:RSV;

02:GCT;

00:PLC网络地址;

17:PLC节点地址;

00:PLC单元地址;

00:PC网络地址;

18:PC节点地址;

00:PC单元地址;

FF:SID;

0102:写指令;

B1:写地址区(D位:02,D字:82,W位:31,C位:30,W字:B1,C字:B0);

000A00:起始地址;【2的24次方-1】,十进制范围【0~16777215】

0002:写个数;写入的字【WORD】个数,也就是【WORD*2】个字节

AABBCCDD:写入数据。 

3.2. 反馈

46494E53 00000016 00000002 00000000 C0 00 02 001800 001700 FF 0102 0000

46494E53:ASCII编码:FINS;

00000016:指后面跟的字节长度;

00000002:固定命令;

00000000:错误代码;

C0:ICF;

00:RSV;

02:GCT;

00:PC网络地址;

18:PC节点地址;

00:PC单元地址;

00:PLC网络地址;

17:PLC节点地址;

00:PLC单元地址;

FF:SID;

0102:写指令;

0000:写入成功标识。

【原封装代码有误,这次重新更新 斯内科 20211116】

下面C#封装程序【部分类FinsTcpUtil.cs】,代码如下:

PLC寄存器区域类型枚举类【OmronAddressType.cs】,源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OmronFinsDemo
{
    /// <summary>
    /// Omron PLC地址类型【存储区域类别】
    /// </summary>
    public enum OmronAddressType
    {
        /// <summary>
        /// C区:I/O继电器区 【Input Output Area】 
        /// 输入区Input 1600 bits=100 word 范围【CIO0~CIO99】
        /// 输出区Output 1600 bits=100 word 范围【CIO100~CIO199】
        /// CPU Bus Unit Area 6400 bits=400Word 范围【CIO1500~CIO1899】
        /// </summary>
        CIO = 0,
        /// <summary>
        /// W区:工作继电器区 【Work Relay Area】
        /// 8192 bits = 512 words 范围【W0~W511】
        /// </summary>
        WR = 1,
        /// <summary>
        /// D区:动态数据存储区,仅可由字(16位Word)进行存取【Data Memory Area】
        /// 32768Words 范围【D0~D32767】
        /// </summary>
        DM = 2,
        /// <summary>
        /// 保持继电器区 【Hold Relay】
        /// 8192 bits = 512 words 范围【H0~H511】
        /// </summary>
        HR = 3,
        /// <summary>
        /// 定时器区 【Timer】
        /// PVs 4096Words  范围【T0~T4095】
        /// CompletionFlag 4096bits 范围【T0~T4095】
        /// </summary>
        TIM = 4,
        /// <summary>
        /// 特殊辅助继电器区 【Auxiliary Relay Area】
        /// ReadOnly 7168 bits=448Words 范围【A0~A447】
        /// Read-Write 8192 bits=512Words 范围【A448~A959】
        /// </summary>
        AR = 5,
        /// <summary>
        /// 计数器区 【Counter】
        /// PVs 4096Words  范围【C0~C4095】
        /// CompletionFlag 4096bits 范围【C0~C4095】
        /// </summary>
        CNT = 6
    }
}

【部分类FinsTcpUtil.cs】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OmronFinsDemo
{
    /// <summary>
    /// FINS(factory interface network service)通信协议是欧姆龙公司开发的用于工业自动化控制网络的指令-响应系统。
    /// 我们只使用欧姆龙PLC的FINS-TCP协议,FINS协议可以读写位(Bit)、字(WORD)操作
    /// 斯内科
    /// </summary>
    public partial class FinsTcpUtil
    {
        /// <summary>
        /// 是否已连接
        
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯内科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值