赞
踩
FINS (factory interface network service)通信协议是欧姆龙公司开发的用于工业自动化控制网络的指令/响应系统。运用FINS指令可实现各种网络间的无缝通信,通过编程发送FINS指令,上位机或PLC就能够读写另一个PLC数据区的内容,甚至控制其运行状态,从而简化了用户程序。FINS协议支持工业以太网,这就为OMRONPLC与上位机以太网通信的实现提供了途径。
在上节内容C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版),我们熟悉了协议报文结构,知道了如何发送命令,接收命令,但是那是为了了解它的报文组成部分,在应用层开发中,我们是不可能直接发送报文来获取数据的,应该使用第3方的通讯库来与PLC通信或者自己写通讯库,这节介绍一个与欧姆龙PLC进行FINS通信的通讯库,也就是说别人写好的代码,只要拿来用就可以了,当然超人,高手需要封装自己的通讯库,下节来写自己的通讯库,这节先熟悉别人的通讯库怎么用,以丰满自己的肌肉。不管是别人写的通讯库还是自己写的通讯库,里面通信的过程和报文都是上节讲的那些结构,只是你看不到。
开发环境采用vs2022,编写控制台程序,通讯库的名称叫“omronfinstcp.net” ,必须先安装好vs2022。
编写代码:
- static void Main(string[] args)
- {
- Console.WriteLine("Hello World!");
- //创建实例
- OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
- //连接plc,5000是超时时间
- var rt= etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
- Console.WriteLine("连接成功!");
-
- Console.ReadKey();
-
- }
可以看到是不是很简单,这是使用通讯库的好处,不要拼什么报文
程序代码:
- static void Main(string[] args)
- {
- Console.WriteLine("Hello World!");
- //创建实例
- OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
- //连接plc,5000是超时时间
- var rt= etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
- Console.WriteLine("连接成功!");
-
- Console.WriteLine("读取bool一个");
- short bvalue = 0;
- etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
- Console.WriteLine("CIO区0.0:" + bvalue);
- etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
- Console.WriteLine("CIO区0.3:" + bvalue);
-
- Console.WriteLine("读取bool多个");
- short bvalue1 = 0;
- for (int i = 0; i < 6; i++)
- {
- etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
- Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
- }
- Console.ReadKey();
- }

注意:这个通讯库有不完善的地方,读取多个bool时,他没有提供对应的方法,他只能读取一个,读取多个,自然要使用循环,所以说别人的库有不完善的地方,下节我自己写的通讯库,比这个强大。
查看报文
程序代码
- static void Main(string[] args)
- {
- Console.WriteLine("Hello World!");
- //创建实例
- OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
- //连接plc,5000是超时时间
- var rt= etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
- Console.WriteLine("连接成功!");
-
- //Console.WriteLine("读取bool一个");
- //short bvalue = 0;
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
- //Console.WriteLine("CIO区0.0:" + bvalue);
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
- //Console.WriteLine("CIO区0.3:" + bvalue);
-
- //Console.WriteLine("读取bool多个");
- //short bvalue1 = 0;
- //for (int i = 0; i < 6; i++)
- //{
- // etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
- // Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
- //}
-
- Console.WriteLine("写入bool一个");
- etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
- etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON);
- Console.WriteLine("写入bool多个");
- for (int i = 0; i < 6; i++)
- {
- etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
- }
- Console.WriteLine("ok");
-
- Console.ReadKey();
- }

同样,他的通讯库不支持写入多个bool类型的数据,必须循环方式写入一个个的。查看PLC内存区,写入成功。
通讯报文
首先设置内存区D区100的4个数据,注意D区设置的数据类型为10进制无符号的整数,对应C#中就是ushort类型。
程序代码
- static void Main(string[] args)
- {
- Console.WriteLine("Hello World!");
- //创建实例
- OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
- //连接plc,5000是超时时间
- var rt= etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
- Console.WriteLine("连接成功!");
-
- //Console.WriteLine("读取bool一个");
- //short bvalue = 0;
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
- //Console.WriteLine("CIO区0.0:" + bvalue);
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
- //Console.WriteLine("CIO区0.3:" + bvalue);
-
- //Console.WriteLine("读取bool多个");
- //short bvalue1 = 0;
- //for (int i = 0; i < 6; i++)
- //{
- // etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
- // Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
- //}
-
- //Console.WriteLine("写入bool一个");
- //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
- //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON);
- //Console.WriteLine("写入bool多个");
- //for (int i = 0; i < 6; i++)
- //{
- // etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
- //}
- //Console.WriteLine("ok");
-
- Console.WriteLine("读取ushort一个");
- short svalue = 0;
- etherNetPLC.ReadWord(OmronFinsTCP.Net.PlcMemory.DM, 100, out svalue);
- Console.WriteLine("d区100:" + svalue);
-
- Console.WriteLine("读取ushort多个");
- short[] shortarray = new short[] { };
- etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 100, 4, out shortarray);
- for (int i = 0; i < shortarray.Length; i++)
- {
- Console.WriteLine("d区100中的" + (i).ToString() + "=" + shortarray[i]);
- }
- Console.WriteLine("ok");
-
-
-
- Console.ReadKey();
- }

可以看到,支持读取多个ushort类型的数据,通讯报文
程序代码
- static void Main(string[] args)
- {
- Console.WriteLine("Hello World!");
- //创建实例
- OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
- //连接plc,5000是超时时间
- var rt= etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
- Console.WriteLine("连接成功!");
-
- //Console.WriteLine("读取bool一个");
- //short bvalue = 0;
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
- //Console.WriteLine("CIO区0.0:" + bvalue);
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
- //Console.WriteLine("CIO区0.3:" + bvalue);
-
- //Console.WriteLine("读取bool多个");
- //short bvalue1 = 0;
- //for (int i = 0; i < 6; i++)
- //{
- // etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
- // Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
- //}
-
- //Console.WriteLine("写入bool一个");
- //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
- //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON);
- //Console.WriteLine("写入bool多个");
- //for (int i = 0; i < 6; i++)
- //{
- // etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
- //}
- //Console.WriteLine("ok");
-
- //Console.WriteLine("读取ushort一个");
- //short svalue = 0;
- //etherNetPLC.ReadWord(OmronFinsTCP.Net.PlcMemory.DM, 100, out svalue);
- //Console.WriteLine("d区100:" + svalue);
-
- //Console.WriteLine("读取ushort多个");
- //short[] shortarray = new short[] { };
- //etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 100, 4, out shortarray);
- //for (int i = 0; i < shortarray.Length; i++)
- //{
- // Console.WriteLine("d区100中的" + (i).ToString() + "=" + shortarray[i]);
- //}
- //Console.WriteLine("ok");
-
- Console.WriteLine("写入ushort一个");
- var myresult = etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, 200, 148);
- Console.WriteLine("ok");
- Console.WriteLine("写入ushort多个");
- for (int i = 0; i < 5; i++)
- {
- etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, (short)(200 + i), (short)(170 + i));
- }
- Console.WriteLine("ok");
-
-
- Console.ReadKey();
- }

写入成功
通讯报文
很遗憾,通讯库不支持H区的读写
设置W区的5个数据
程序代码
- static void Main(string[] args)
- {
- Console.WriteLine("Hello World!");
- //创建实例
- OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
- //连接plc,5000是超时时间
- var rt= etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
- Console.WriteLine("连接成功!");
-
- //Console.WriteLine("读取bool一个");
- //short bvalue = 0;
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
- //Console.WriteLine("CIO区0.0:" + bvalue);
- //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
- //Console.WriteLine("CIO区0.3:" + bvalue);
-
- //Console.WriteLine("读取bool多个");
- //short bvalue1 = 0;
- //for (int i = 0; i < 6; i++)
- //{
- // etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
- // Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
- //}
-
- //Console.WriteLine("写入bool一个");
- //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
- //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON);
- //Console.WriteLine("写入bool多个");
- //for (int i = 0; i < 6; i++)
- //{
- // etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
- //}
- //Console.WriteLine("ok");
-
- //Console.WriteLine("读取ushort一个");
- //short svalue = 0;
- //etherNetPLC.ReadWord(OmronFinsTCP.Net.PlcMemory.DM, 100, out svalue);
- //Console.WriteLine("d区100:" + svalue);
-
- //Console.WriteLine("读取ushort多个");
- //short[] shortarray = new short[] { };
- //etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 100, 4, out shortarray);
- //for (int i = 0; i < shortarray.Length; i++)
- //{
- // Console.WriteLine("d区100中的" + (i).ToString() + "=" + shortarray[i]);
- //}
- //Console.WriteLine("ok");
-
- //Console.WriteLine("写入ushort一个");
- //var myresult = etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, 200, 148);
- //Console.WriteLine("ok");
- //Console.WriteLine("写入ushort多个");
- //for (int i = 0; i < 5; i++)
- //{
- // etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, (short)(200 + i), (short)(170 + i));
- //}
- //Console.WriteLine("ok");
-
- //Console.WriteLine("读取short多个");
- //short[] shortarray = new short[] { };
- //etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory., 100, 4, out shortarray);
- //for (int i = 0; i < shortarray.Length; i++)
- //{
- // Console.WriteLine("H区100中的" + (i).ToString() + "=" + shortarray[i]);
- //}
- //Console.WriteLine("ok");
-
- Console.WriteLine("读取float一个");
- float fvalue = 0.0f;
- etherNetPLC.ReadReal(OmronFinsTCP.Net.PlcMemory.WR, 100, out fvalue);
- Console.WriteLine("w区100:" + fvalue);
-
- Console.WriteLine("读取float多个");
- float fvalue2 = 0.0f;
- for (int i = 0; i < 5; i++)
- {
- etherNetPLC.ReadReal(OmronFinsTCP.Net.PlcMemory.WR, (short)(100 + i * 2), out fvalue2);
- Console.WriteLine("w区200中的" + (i).ToString() + "=" + fvalue2);
- }
-
-
- Console.ReadKey();
- }

通讯报文
很遗憾,没有提供写入浮点数的方法
FINS协议是一种基于TCP/IP网络通信的实时通信协议.能够实现欧姆龙工业设备之间的数据交换和控制指令传输。它采用了客户端/服务器模型,客户端发送请求,服务器返回响应,通过建立连接、传输数据包来实现设备之间的通信。
FINS协议的核心是消息和指令的传输。消息格式包括消息头、命令和数据区。消息头定义了消息的类型、长度和地址等信息。命令部分包含了具体的指令内容,如读取数据、写入数据或执行其他操作。数据区则是存储实际的数据信息。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。