C#读写横河PLC读写YokogawaPLC读写数据,读取PLC信息读取特殊的模块信息

C#读写横河PLC读写YokogawaPLC读写数据读取PLC信息读
取特殊的模块信息
本⽂将使⽤库技术来读写横河PLC数据,使⽤的是基于横河⾃⾝协议实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件⽀持超级⽅便的⾼性能读写操作
在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输⼊下⾯的指令安装:
Install-Package HslCommunication
如果你需要在读取PLC数据之后,还要发客户端来实现远程办公室同步监视,可以参考如下的项⽬(基于该组件扩展起来的,带有账户验证,版本控制,数据发,公告管理等等功能)
本⽂将展⽰如何配置⽹络参数及怎样使⽤代码来访问PLC数据,希望给有需要的⼈解决⼀些实际问题。主要对基恩⼠的数据进⾏读写操作,具体的参照下⾯的地址信息
此处使⽤了⽹线直接的⽅式,如果PLC接进了局域⽹,就可以进⾏远程读写了^_^
此处使⽤到了2个命名空间:
using HslCommunication;
using HslCommunication.Profinet.Yokogawa;
随便聊聊
当我们⼀个上位机需要读取100台西门⼦PLC设备(此处只是举个例⼦,凡是都是使⽤Modbus tcp的都是⼀样的)的时候,你采⽤服务器主动去请求100台设备的机制对性能来说是个极⼤的考验,如果开100个线程去轮询100台设备,那么性能损失将是⾮常⼤的,更不⽤说再增加设备,如果搭建Modbus tcp服务器,就可以完美的解决性能问题,因为连接的压⼒将会平均分摊给每⼀台PLC,服务器端只要新增⼀个时间戳就可以知道客户端有没有连接上。
我们在100台PLC⾥都增加发送Modbus tcp⽅法,将数据发送到服务器的ip和端⼝上去,服务器根据站号来区分设备。这样就可以搭建⼀个⾼性能总站。本组件⽀持快速搭建⼀个⾼性能的Modbus tcp总站。
关于两种模式
喷胶
在PLC端,包括三菱,西门⼦,欧姆龙,横河以及Modbus Tcp客户端的访问器上,都⽀持两种模式,短连接模式和长连接模式,现在就来解释下什么原理。
短连接:每次读写都是⼀个单独的请求,请求完毕也就关闭了,如果服务器的端⼝仅仅⽀持单连接,那么关闭后这个端⼝可以被其他连接复⽤,但是在频繁的⽹络请求下,容易发⽣异常,会有其他的请求不成功,尤其是多线程的情况下。
长连接:创建⼀个公⽤的连接通道,所有的读写请求都利⽤这个通道来完成,这样的话,读写性能更快速,即时多线程调⽤也不会影响,内部有同步机制。如果服务器的端⼝仅仅⽀持单连接,那么这个端⼝就被占⽤了,⽐如三菱的端⼝机制,西门⼦的Modbus tcp端⼝机制也是这样的。以下代码默认使⽤长连接,性能更⾼,还⽀持多线程同步。
在短连接的模式下,每次请求都是单独的访问,所以没有重连的困扰,在长连接的模式下,如果本次请求失败了,在下次请求的时候,会⾃动重新连接服务器,直到请求成功为⽌。另外,尽量所有的读写都对结果的成功进⾏判断。
关于⽇志记录
不管是基恩⼠的,三菱的数据访问类,还是西门⼦的,还是Modbus tcp访问类,都有⼀个LogNet属性⽤来记录⽇志,该属性是⼀个接⼝类,ILogNet,凡事继承该接⼝的都可以⽤来记录⽇志,该⽇志会在访问失败时,尤其是因为⽹络的原因导致访问失败时会进⾏⽇志记录(如果你为这个 LogNet 属性配置了真实的⽇志记录器的话):如果你想使⽤该记录⽇志的功能,请参照如下的博客进⾏实例化:
访问测试项⽬
下⾯的⼀个项⽬是这个组件的访问测试项⽬,您可以进⾏初步的访问的测试,免去了您写测试程序的⿇烦,三菱的界⾯和西门⼦的界⾯⼏乎是⼀致的。可以同时参考。该项⽬位于本篇⽂章开始处的Gitbub源代码⾥⾯的
下载地址为:
演⽰项⽬
下⾯的三篇演⽰了具体如何去访问PLC的数据,我们在访问完成后,通常需要进⾏处理,以下的⽰例项⽬就演⽰了后台从PLC读取数据后,前台显⽰并推送给所有在线客户端的功能,客户端并进⾏图形化显⽰,具有⼀定的参考意义,并且推送给⽹页前端,项⽬地址为:
下⾯的图⽚⽰例中的左边程序就是服务器程序,它应该和PLC直接连接并接⼊局域⽹,然后把数据推送给客户端显⽰。注意:⼀个复杂⾼级的程序就应该把处理逻辑程序和界⾯程序分开,⽐如这⾥的服务器程序实现数据采集,推送,存储。让客户端程序去实现数据的整理,分析,显⽰,这样即使客户端程序因为BUG奔溃,服务器端仍然可以正常的⼯作。
安卓演⽰项⽬:
请加下载,或是在华为,⼩⽶,应⽤宝等APP应⽤商店搜索HslCommunicaition 进⾏下载安装!
代码篇
下⾯也做⼀些说明
关于⽀持的地址:
对于所有的数据读写,我们分为两⼤类,读写Bool数据,读写字节数据。对应的⽅法分别是
OperateResult<bool[]> ReadBool( string address, ushort length )
OperateResult<bool> ReadBool( string address )
OperateResult Write( string address, bool[] value )
OperateResult Write( string address, bool value ) 
这类⽅法都是读写线圈的,针对的是X,Y,I,E,M,T,C,L线圈。
⽽其他的Read(string address, ushort length) 和写⼊,读取其他类型的都是寄存器的
好了。先从实例化开始
private YokogawaLinkTcp yokogawa = new YokogawaLinkTcp( "127.0.0.1", 12289 );
实例化之后就需要连接PLC了
OperateResult connect = yokogawa.ConnectServer( );
if (connect.IsSuccess)
{
MessageBox.Show( "连接成功" );
}
离心制丸机else
{
MessageBox.Show( "连接失败" );
}
连接的时候可能会失败,因为⽹络等等的原因,所以需要连接判断。连接成功之后,就可以进⾏读写数据了。我们先来看看如何读取⼀个X 的点位信息
OperateResult<bool> read = yokogawa.ReadBool( "X0" );
if (read.IsSuccess)
水性聚氨酯墙漆{
bool value = read.Content; // true 表⽰通, false 表⽰断
}
else
{
Console.WriteLine( "Read failed: " + read.Message );
}
因为X的点位不能写⼊操作,所以下⾯写⼊Y信号。
OperateResult write = yokogawa.Write( "Y0", true );
if (write.IsSuccess)
{
Console.WriteLine( "Write success! " );  // 写⼊成功
}
else
{
Console.WriteLine( "Write failed: " + write.Message );
}
如果我要批量读取点位信息呢?
OperateResult<bool[]> readArray = yokogawa.ReadBool( "X0", 20 );
if (readArray.IsSuccess)
{
bool[] value = readArray.Content; // ⼀个数组value[0] 就是X0, 按照索引依次往后对应
}
else
{
飞机加油车Console.WriteLine( "Read failed: " + readArray.Message );
}
批量写⼊数组也是类似的。
OperateResult writeArray = yokogawa.Write( "Y0", new bool[] { true, false, true, false, false } );
if (writeArray.IsSuccess)
{
Console.WriteLine( "Write success! " );  // 写⼊成功  Y0=true, Y1=false, Y2=true, Y3=false, Y4=false
}
else
{
Console.WriteLine( "Write failed: " + writeArray.Message );
}
线圈的操作都是相似的,除了地址不⼀样,其他的操作都是类似的。我们再来看看寄存器的操作。
OperateResult<short> read = yokogawa.ReadInt16( "D0" );
if (read.IsSuccess)
{
short value = read.Content; // value 就是D0的值
}
else
{
Console.WriteLine( "Read failed: " + read.Message );
  当然了,PLC在D0存储的不⼀定是整数值,有可能是个浮点数
OperateResult<float> readfloat = yokogawa.ReadFloat( "D0" );
if (readfloat.IsSuccess)
{
float value = readfloat.Content; // value 就是D0的值
}
else
{
Console.WriteLine( "Read failed: " + readfloat.Message );
}
 如果是写⼊,也是同理。
OperateResult write = yokogawa.Write( "D0", (short)123 );
if (write.IsSuccess)
{
固定篮球架Console.WriteLine( "write success" ); // 写⼊成功
}
else
{
Console.WriteLine( "write failed: " + write.Message );
}
写⼊浮点数也是同理,这⾥就不赘述了:
yokogawa.Write( "D0", 123f )
读取连续的short数组, float数组?
OperateResult<short[]> readArray = yokogawa.ReadInt16( "D0", 10 );
if (readArray.IsSuccess)
{
short[] value = readArray.Content; // value[0] 就是D0的值, value[1] 就是D1的值,以此类推
}
else
{
Console.WriteLine( "Read failed: " + readArray.Message );
}
float数组的读取也是类似的,也是加⼀个length。
yokogawa.ReadFloat( "D0", 10 );
聚氨酯生产工艺
批量的写⼊也是类似的。
OperateResult writeArray = yokogawa.Write( "D0", new short[] { 123, 456, 789, 1234 } );
if (writeArray.IsSuccess)
{
Console.WriteLine( "write success" ); // 写⼊成功
}
else
{
Console.WriteLine( "write failed: " + writeArray.Message );
}
我们来看⼀个⾼级点的操作,我们要读取不通的线圈的点位信息,怎么操作?
// 使⽤随机读取的⽅式读取不同地址的数据信息
OperateResult<bool[]> read = yokogawa.ReadRandomBool( new string[] { "X0", "Y100", "M200", "M1000" } );            if (read.IsSuccess)
{
bool x_0 = read.Content[0];
bool y_100 = read.Content[1];
bool m_200 = read.Content[2];
bool m_1000 = read.Content[3];
}
else
{
Console.WriteLine( "Read failed, reason: " + read.Message );
写⼊也是类似的:
OperateResult write = yokogawa.WriteRandomBool( new string[] { "X0", "Y100", "M200", "M1000" },                new bool[] { true, false, false, true } );
if (write.IsSuccess)
{
Console.WriteLine( "write plc success!" );
}
else
{
Console.WriteLine( "write failed:" + write.Message );
return;
}
读取特殊模块的信息
// 读取PLC的特殊模块的地址数据
OperateResult<byte[]> read = yokogawa.ReadSpecialModule( 1, 2, 100, 2 );
if (read.IsSuccess)
{
// 我们读取到了原始的数据内容
byte[] content = read.Content;
}
else
{
Console.WriteLine( "Read failed, reason: " + read.Message );
写⼊也是类似
OperateResult<short> readInt16 = yokogawa.ReadInt16( "Special:unit=1;slot=2;100" );
if (readInt16.IsSuccess)
{
Console.WriteLine( "Read D100: " + readInt16.Content );
}
else
{
Console.WriteLine( "Read failed, reason: " + readInt16.Message );
return;
}
当然了,本组件⽀持读PLC的基本信息,报警信息,更详细的参考API⽂档。
如果你没有相关的PLC信息,却⼜想进⾏相关测试的,可以使⽤HSL来构建虚拟PLC
具体参考类 YokogawaLinkServer

本文发布于:2024-09-24 15:15:40,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/216149.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   连接   读取
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议