本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作

github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持,打赏请认准源代码项目。

在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:

Install-Package HslCommunication

如果需要教程:Nuget安装教程:http://www.cnblogs.com/dathlin/p/7705014.html

组件的完整信息和API介绍参照:http://www.cnblogs.com/dathlin/p/7703805.html   组件的使用限制,更新日志,都在该页面里面。

如果你需要在读取PLC数据之后,还要群发客户端来实现远程办公室同步监视,可以参考如下的项目(基于该组件扩展起来的,带有账户验证,版本控制,数据群发,公告管理等等功能)

https://github.com/dathlin/ClientServerProject

本文将展示如何配置网络参数及怎样使用代码来访问PLC数据,希望给有需要的人解决一些实际问题。主要对三菱Q系列PLC的X,Y,M,L,B,V,F,S,D,W,R区域的数据读写,对西门子PLC的M,Q,I,DB块的数据读写,亲测有效。

此处使用了网线直接的方式,如果PLC接进了局域网,就可以进行远程读写了^_^

此处使用到了2个命名空间:

using HslCommunication;
using HslCommunication.Profinet;

随便聊聊


当我们一个上位机需要读取100台西门子PLC设备(此处只是举个例子,凡是都是使用Modbus tcp的都是一样的)的时候,你采用服务器主动去请求100台设备的机制对性能来说是个极大的考验,如果开100个线程去轮询100台设备,那么性能损失将是非常大的,更不用说再增加设备,如果搭建Modbus tcp服务器,就可以完美的解决性能问题,因为连接的压力将会平均分摊给每一台PLC,服务器端只要新增一个时间戳就可以知道客户端有没有连接上。

我们在100台PLC里都增加发送Modbus tcp方法,将数据发送到服务器的ip和端口上去,服务器根据站号来区分设备。这样就可以搭建一个高性能总站。 本组件支持快速搭建一个高性能的Modbus tcp总站。

http://www.cnblogs.com/dathlin/p/7782315.html

关于两种模式


在PLC端,包括三菱,西门子,欧姆龙以及Modbus Tcp客户端的访问器上,都支持两种模式,短连接模式和长连接模式,现在就来解释下什么原理。

短连接:每次读写都是一个单独的请求,请求完毕也就关闭了,如果服务器的端口仅仅支持单连接,那么关闭后这个端口可以被其他连接复用,但是在频繁的网络请求下,容易发生异常,会有其他的请求不成功,尤其是多线程的情况下。

长连接:创建一个公用的连接通道,所有的读写请求都利用这个通道来完成,这样的话,读写性能更快速,即时多线程调用也不会影响,内部有同步机制。如果服务器的端口仅仅支持单连接,那么这个端口就被占用了,比如三菱的端口机制,西门子的Modbus tcp端口机制也是这样的。以下代码默认使用长连接,性能更高,还支持多线程同步。

在短连接的模式下,每次请求都是单独的访问,所以没有重连的困扰,在长连接的模式下,如果本次请求失败了,在下次请求的时候,会自动重新连接服务器,直到请求成功为止。另外,尽量所有的读写都对结果的成功进行判断。

关于日志记录


不管是三菱的数据访问类,还是西门子的,还是Modbus tcp访问类,都有一个LogNet属性用来记录日志,该属性是一个接口类,ILogNet,凡事继承该接口的都可以用来记录日志,该日志会在访问失败时,尤其是因为网络的原因导致访问失败时会进行日志记录(如果你为这个 LogNet 属性配置了真实的日志记录器的话):如果你想使用该记录日志的功能,请参照如下的博客进行实例化:

http://www.cnblogs.com/dathlin/p/7691693.html

访问测试项目


下面的一个项目是这个组件的访问测试项目,您可以进行初步的访问的测试,免去了您写测试程序的麻烦,三菱的界面和西门子的界面几乎是一致的。可以同时参考。该项目位于本篇文章开始处的Gitbub源代码里面的

下载地址为:HslCommunicationDemo.zip

演示项目


下面的三篇演示了具体如何去访问PLC的数据,我们在访问完成后,通常需要进行处理,以下的示例项目就演示了后台从PLC读取数据后,前台显示并推送给所有在线客户端的功能,客户端并进行图形化显示,具有一定的参考意义,并且推送给网页前端,项目地址为:

https://github.com/dathlin/RemoteMonitor

下面的图片示例中的左边程序就是服务器程序,它应该和PLC直接连接并接入局域网,然后把数据推送给客户端显示。注意:一个复杂高级的程序就应该把处理逻辑程序和界面程序分开,比如这里的服务器程序实现数据采集,推送,存储。让客户端程序去实现数据的整理,分析,显示,这样即使客户端程序因为BUG奔溃,服务器端仍然可以正常的工作。

三菱PLC篇(下面列举了三种配置方法,本组件支持二进制和ASCII通讯,支持1E帧兼容协议访问)


Q06UDV Plc的访问测试感谢:hwdq0012

fx5u plc的访问测试感谢:山楂

Q02CPU, L02CPU-CM : 本人测试

感谢:小懒猪雨中人  的测试,VB程序也可以调用本通讯库

环境1:此处以GX Works3为示例,fx5u的配置如下:(感谢 山楂 提供的图片)

环境2:此处以GX Works2为示例,测试PLC为L02CPU,内置了以太网协议

环境3:此处以GX Works2为示例,添加以太网模块,型号为QJ71E71-100,组态里添加完成后进行以太网的参数配置,此处需要注意的是:参数的配置对接下来的代码中配置参数要一一对应

注意:在PLC的以太网模块的配置中,无法设置网络号为0,也无法设置站号为0, 所以此处均设置为1,在C#程序中也使用上述的配置,在代码中均配置为0,如果您自定义设置为网络2, 站号8,那么在代码中就要写对应的数据。如果仍然通信失败,重新测试0,0。

打开设置:在上图中的打开设置选项,进行其他参数的配置,下图只是举了一个例子,开通了4个端口来支持读写操作:

端口号设置规则:

  • 为了不与原先存在的系统发生冲突,您在添加自己的端口时尽量使用您自己的端口。
  • 如果读写都需要,尽可能的将读取端口和写入端口区分开来,这样做比较高性能。
  • 如果您的网络状态不是特别稳定,读取端口使用2个,一个受阻切换另一个读取可以提升系统的稳定性。

本文档仅作组件的测试,所以只用了一个端口作为读写。如果你的程序也使用了一个端口,那么你在读取数据时候, 刚好也在写入(异步操作可能发生这样的情况),那么写入会失败!)(在长连接模式下没有这个问题)

三菱PLC的数据主要由两类数据组成,位数据和字数据,在位数据中,例如X,Y,M,L都是位数据,字数据例如D,W。 两类的数据在读取解码上存在一点小差别。(事实上也可以先将16个M先赋值给一个D,读取D数据再进行解析, 在读取M的数量比较多的时候,这样操作效率更高)

初始化访问PLC对象

注意:如果你想采用ASCII来读写数据,请使用MelsecMcAsciiNet类,如果想采用1E帧协议,使用MelsecA1ENet类,除了实例化,其他的数据交互都是一样的。
如果想使用本组件的数据读取功能,必须先初始化数据访问对象,根据实际情况进行数据的填入。 下面仅仅是测试中的数据:

private MelsecMcNet melsec_net = new MelsecMcNet( "192.168.0.1", 6000 );

如上图所示,只要指定了IP地址和端口号就完成了初始化的搭建了,当然还支持一些额外的信息配置

            melsec_net.ConnectTimeOut = 2000; // 网络连接的超时时间melsec_net.NetworkNumber = 0x00;  // 网络号melsec_net.NetworkStationNumber = 0x00; // 网络站号

打开连接,并可以判断是否连接上

melsec_net.ConnectClose( );

如果需要判断,那么按照如下的操作

                OperateResult connect = melsec_net.ConnectServer( );if (connect.IsSuccess){MessageBox.Show( "连接成功!" );}else{MessageBox.Show( "连接失败!" );}

说明:对象应该放在窗体类下面,此处仅仅针对读取一台设备的plc,也可以在访问的方法中实例化局部对象, 初始化数据,然后读取,该对象几乎不损耗内存,内存垃圾由CLR进行自动回收。此处测试方便,窗体的多个按钮均连接同一台PLC 设备,所以本窗体实例化一个对象即可。

关于两种地址的表示方式

第一种,使用系统的类来标识,比如M200,写成(MelsecDataType.M, 200)的表示形式,这样也可以去MelsecDataType里面找到所有支持的数据类型。

第二种,使用字符串表示,这个组件里所有的读写操作提供字符串表示的重载方法,所有的支持访问的类型对应如下,字符串的表示方式存在十进制和十六进制的区别:

  • 输入继电器:"X100","X1A0"            // 字符串为十六进制机制
  • 输出继电器:"Y100" ,"Y1A0"           // 字符串为十六进制机制
  • 内部继电器:"M100","M200"           // 字符串为十进制
  • 锁存继电器:"L100"  ,"L200"           // 字符串为十进制
  • 报警器:       "F100", "F200"            // 字符串为十进制
  • 边沿继电器:"V100" , "V200"          // 字符串为十进制
  • 链接继电器:"B100" , "B1A0"          // 字符串为十六进制
  • 步进继电器:"S100" , "S200"          // 字符串为十进制
  • 数据寄存器:"D100", "D200"           // 字符串为十进制
  • 链接寄存器:"W100" ,"W1A0"         // 字符串为十六进制
  • 文件寄存器:"R100","R200"            // 字符串为十进制

展示一些简单实用基础数据读写,这些数据的读写没有进行严格的是否成功判断(判断方法参照后面的代码),一般网络良好的情况下都会成功,但不排除失败,以下代码仅作测试,所有没有严格判断是否成功:

            bool[] M100 = melsec_net.ReadBool("M100",1).Content;            // 读取M100是否通,十进制地址bool[] X1A0 = melsec_net.ReadBool("X1A0",1).Content;            // 读取X1A0是否通,十六进制地址bool[] Y1A0 = melsec_net.ReadBool("Y1A0",1).Content;            // 读取Y1A0是否通,十六进制地址bool[] B1A0 = melsec_net.ReadBool("B1A0",1).Content;            // 读取B1A0是否通,十六进制地址short short_D1000 = melsec_net.ReadInt16("D1000").Content;   // 读取D1000的short值  ,W3C0,R3C0 效果是一样的ushort ushort_D1000 = melsec_net.ReadUInt16("D1000").Content; // 读取D1000的ushort值int int_D1000 = melsec_net.ReadInt32("D1000").Content;          // 读取D1000-D1001组成的int数据uint uint_D1000 = melsec_net.ReadUInt32("D1000").Content;       // 读取D1000-D1001组成的uint数据float float_D1000 = melsec_net.ReadFloat("D1000").Content;    // 读取D1000-D1001组成的float数据long long_D1000 = melsec_net.ReadInt64("D1000").Content;       // 读取D1000-D1003组成的long数据ulong ulong_D1000 = melsec_net.ReadUInt64( "D1000" ).Content;       // 读取D1000-D1003组成的long数据double double_D1000 = melsec_net.ReadDouble("D1000").Content; // 读取D1000-D1003组成的double数据string str_D1000 = melsec_net.ReadString("D1000", 10).Content; // 读取D1000-D1009组成的条码数据melsec_net.Write("M100", new bool[] { true} );                        // 写入M100为通melsec_net.Write( "Y1A0", new bool[] { true } );                        // 写入Y1A0为通melsec_net.Write( "X1A0", new bool[] { true } );                        // 写入X1A0为通melsec_net.Write( "B1A0", new bool[] { true } );                        // 写入B1A0为通melsec_net.Write( "D1000", (short)1234);                // 写入D1000  short值  ,W3C0,R3C0 效果是一样的melsec_net.Write( "D1000", (ushort)45678);              // 写入D1000  ushort值melsec_net.Write( "D1000", 1234566);                    // 写入D1000  int值melsec_net.Write( "D1000", (uint)1234566);               // 写入D1000  uint值melsec_net.Write( "D1000", 123.456f);                    // 写入D1000  float值melsec_net.Write( "D1000", 123.456d);                    // 写入D1000  double值melsec_net.Write( "D1000", 123456661235123534L);          // 写入D1000  long值melsec_net.Write( "D1000", "K123456789");                // 写入D1000  string值

下面再分别讲解严格的操作,以及批量化的复杂的读写操作,假设你要读取1000个M,循环读取1千次可能要3秒钟,如果用了下面的批量化读取,只需要50ms,但是需要你对字节的原理比较熟悉才能得心应手的处理

X,Y,M,L,F,V,B,S位数据的读写说明

  • X 输入继电器
  • Y 输出继电器
  • M 内部继电器
  • L 锁存继电器
  • F 报警器
  • V 边沿继电器
  • B 链接继电器
  • S 步进继电器

本小节将展示八种位数据的读取,虽然更多的时候只是读取D数据即可,或者是将位数据批量挪到D数据中, 但是在此处仍然进行介绍单独的读取X,Y,M,L,F,V,B,S,由于这八种读取手法一致,故针对M数据进行介绍,其他的您可以自己测试。

如下方法演示读取了M200-M209这10个M的值,注意:读取长度必须为偶数,即时写了奇数,也会补齐至偶数,读取和写入的最大长度为7168,否则报错。如需实际需求确实大于7168的,请分批次读取。
返回值解析:如果读取正常则共返回10个字节的数据,以下示例数据进行批量化的读取

        private void userButton20_Click(object sender, EventArgs e){// M200-M209读取显示OperateResult<bool[]> read = melsec_net.ReadBool("M200", 10);if (read.IsSuccess){// 成功读取,True代表通,False代表不通bool M200 = read.Content[0];bool M201 = read.Content[1];bool M202 = read.Content[2];bool M203 = read.Content[3];bool M204 = read.Content[4];bool M205 = read.Content[5];bool M206 = read.Content[6];bool M207 = read.Content[7];bool M208 = read.Content[8];bool M209 = read.Content[9];// 显示}else{//失败读取,显示失败信息MessageBox.Show(read.ToMessageShowString());}}private void userButton21_Click(object sender, EventArgs e){// X100-X10F读取显示OperateResult<bool[]> read = melsec_net.ReadBool("X200", 16);if (read.IsSuccess){// 成功读取,True代表通,False代表不通bool X200 = read.Content[0];bool X201 = read.Content[1];bool X202 = read.Content[2];bool X203 = read.Content[3];bool X204 = read.Content[4];bool X205 = read.Content[5];bool X206 = read.Content[6];bool X207 = read.Content[7];bool X208 = read.Content[8];bool X209 = read.Content[9];bool X20A = read.Content[10];bool X20B = read.Content[11];bool X20C = read.Content[12];bool X20D = read.Content[13];bool X20E = read.Content[14];bool X20F = read.Content[15];// 显示}else{//失败读取,显示失败信息MessageBox.Show(read.ToMessageShowString());}}private void userButton3_Click(object sender, EventArgs e){// M100-M104 写入测试 此处写入后M100:通 M101:断 M102:断 M103:通 M104:通bool[] values = new bool[] { true, false, false, true, true };// 等同于 byte[] values = new byte[]{0x01,0x00,0x00,0x01,0x01}OperateResult write = melsec_net.Write("M100", values);if (write.IsSuccess){TextBoxAppendStringLine("写入成功");}else{MessageBox.Show(write.ToMessageShowString());}}

错误说明:有可能因为站号网络号没有配置正确返回有错误代号没有错误信息, 也有可能因为网络问题导致没有连接上,此时会有连接不上的错误信息。

下面展示的是后台线程循环读取的情况,事实上在实际的使用过程中经常会碰见的情况。下面的方法需要 放到单独的线程中,同理,访问D数据时也是按照下面循环就行,此处不再赘述。

    //后台循环读取PLC数据 M200开始10个字 也即是M200-M209while (true){OperateResult<bool[]> read = melsec_net.ReadFromPLC("M200", 10);if (read.IsSuccess){//成功读取,委托显示textBox2.BeginInvoke(new Action(delegate{textBox2.Text = "M201:" + (read.Content[1] ? "通" : "断");}));}else{//失败读取,应该对失败信息进行日志记录,不应该显示,测试访问时才适合显示错误信息LogHelper.save(read.ToMessageShowString());}System.Threading.Thread.Sleep(1000);//决定了访问的频率}

  

D,W,R字数据的读写操作

此处读取针对中间存在整数数据的情况,因为两者读取方式相同,故而只演示一种数据读取, 使用该组件读取数据,一次最多读取或写入960个字,超出则失败。 如果读取的长度确实超过限制,请考虑分批读取。

        private void userButton2_Click(object sender, EventArgs e){// D100-D104读取OperateResult<byte[]> read = melsec_net.Read("D100", 5);if (read.IsSuccess){// 成功读取,提取各自的值,此处的值有个前提假设,假设PLC上的数据是有符号的数据,表示-32768-32767short D100 = melsec_net.ByteTransform.TransInt16(read.Content, 0);short D101 = melsec_net.ByteTransform.TransInt16( read.Content, 2);short D102 = melsec_net.ByteTransform.TransInt16( read.Content, 4);short D103 = melsec_net.ByteTransform.TransInt16( read.Content, 6);short D104 = melsec_net.ByteTransform.TransInt16( read.Content, 8);TextBoxAppendStringLine("D100:" + D100);TextBoxAppendStringLine("D101:" + D101);TextBoxAppendStringLine("D102:" + D102);TextBoxAppendStringLine("D103:" + D103);TextBoxAppendStringLine("D104:" + D104);}else{//失败读取MessageBox.Show(read.ToMessageShowString());}}private void userButton4_Click( object sender, EventArgs e ){short[] values = new short[5] { 1335, 8765, 1234, 4567, -2563 };// D100为1234,D101为8765,D102为1234,D103为4567,D104为-2563OperateResult write = melsec_net.Write( "D6000", values );if (write.IsSuccess){//成功写入TextBoxAppendStringLine( "写入成功" );}else{MessageBox.Show( write.ToMessageShowString( ) );}}

  

ASCII字符串数据的读写

在实际项目中,有可能会碰到PLC存储了规格数据,或是条码数据,这些数据是以ASCII编码形式存在, 我们需要把数据进行读取出来用于显示,保存等操作。下面演示读取指定长度的条码数据,数据的数据存放在D2000-D2004中, 长度应该为存储条码的最大长度,也即是占用了5个D,一个D可以存储2个ASCII码字符:

    private void button7_Click(object sender, EventArgs e){//读取字符串数据,共计10个字节长度OperateResult<byte[]> read = melsec_net.Read("D2000", 5);if (read.IsSuccess){//成功读取textBox2.Text = Encoding.ASCII.GetString(read.Content);}else{//失败读取MessageBox.Show(read.ToMessageShowString());}}private void button8_Click(object sender, EventArgs e){//写字符串,如果写入K12345678这9个字符,读取出来时末尾会补0OperateResult write = melsec_net.WriteAsciiString("D2000", "K123456789");if (write.IsSuccess){textBox2.Text = "写入成功";}else{MessageBox.Show(write.ToMessageShowString());}}

  

需要注意的是,如果第一次在D2000-D2004中写入了"K123456789",第二次写入了"K6666",那么读取D2000-D2004的条码数据会读取到 K666656789,如果要避免这种情况,则需要在写入条码的时候,指定总长度,该长度必须为偶数, 不然也会自动补0,小于该长度时,自动补零,大于该长度时,自动截断数据,具体的使用方法如下:

    private void button8_Click(object sender, EventArgs e){//写字符串,本次写入指定了10个长度的字符,其余的D的数据将被清空,是一种安全的写入方式OperateResult write = melsec_net.WriteAsciiString("D2000", "K6666", 10);if (write.IsSuccess){textBox2.Text = "写入成功";}else{MessageBox.Show(write.ToMessageShowString());}}

  

中文及特殊字符的读写

在需要读写复杂的字符数据时,上述的ASCII编码已经不能满足要求,虽然使用读写的基础方法可以实现任意数据的读写, 但是此处为了方便,还是提供了一个方便的方法来读写中文数据,采用Unicode编码的字符, 该编码下的一个字符占用一个D或W来存储。如下将演示,读写方法,基本用途和上述 ASCII编码的读写一致。

    private void button9_Click(object sender, EventArgs e){//读中文,存储在D3000-D3009OperateResult<byte[]> read = melsec_net.Read("D3000", 10);if (read.IsSuccess){//解析数据textBox2.Text = Encoding.Unicode.GetString(read.Content);}else{MessageBox.Show(read.ToMessageShowString());}}private void button10_Click(object sender, EventArgs e){//写中文 D3000-D3009,该10含义为中文字符数OperateResult write = melsec_net.WriteUnicodeString("D3000", "测试数据test", 10);if (write.IsSuccess){textBox2.Text = "写入成功";}else{MessageBox.Show(write.ToMessageShowString());}}

 

一个实际中复杂的例子演示

实际中可能碰到的情况会很复杂,一台设备中需要上传的数据包含了温度,压力,产量,规格等等信息,在一串数据中 会包含各种各样的不同的数据,上述的读取D,读取M,读取条码的方式不太好用,所以此处做一个完整示例的演示,假设我们需要读取 D4000-D4009的数据,假设D4000存放了温度数据,55.1℃在D中为551,D4001存放了压力数据,1.23MPa在D中存放为123,D4002存放了 设备状态,0为停止,1为运行,D4003存放了产量,1000就是指1000个,D4004备用,D4005-D4009存放了规格,以下代码演示如何去解析数据:

    private void button29_Click(object sender, EventArgs e){//解析复杂数据OperateResult<byte[]> read = melsec_net.Read("D4000", 10);if (read.IsSuccess){double 温度 = melsec_net.ByteTransform.TransInt16(read.Content, 0) / 10d;//索引很重要double 压力 = melsec_net.ByteTransform.TransInt16(read.Content, 2) / 100d;bool IsRun = melsec_net.ByteTransform.TransInt16(read.Content, 4) == 1;int 产量 = BitConverter.ToInt16(read.Content, 6);string 规格 = Encoding.ASCII.GetString(read.Content, 10, 10);}else{MessageBox.Show(read.ToMessageShowString());}}

究极数据读取展示,用于测试你自己的报文以及扩展自己的更高级,更变态的API,以下演示,使用这个高级模式,写入M100,True的操作:

我们要写入的字节数组HEX表示形式为:50 00 00 FF FF 03 00 0D 00 0A 00 01 14 01 00 64 00 00 90 01 00 10

        private void userButton23_Click(object sender, EventArgs e){byte[] buffer = HslCommunication.BasicFramework.SoftBasic.HexStringToBytes("50 00 00 FF FF 03 00 0D 00 0A 00 01 14 01 00 64 00 00 90 01 00 10");// 直接使用报文进行OperateResult<byte[]> operate = melsec_net.ReadFromCoreServer(buffer);if(operate.IsSuccess){// 返回PLC的报文反馈,需要自己对报文进行结果分析MessageBox.Show(HslCommunication.BasicFramework.SoftBasic.ByteToHexString(operate.Content));}else{// 网络原因导致的失败MessageBox.Show(operate.ToMessageShowString());}}

更详细的信息,可以参照源代码里面的测试项目。

创作不易,感谢打赏


西门子篇参见另一篇博客:http://www.cnblogs.com/dathlin/p/8685855.html

 

转载于:https://www.cnblogs.com/dathlin/p/7469679.html

C#读写三菱PLC和西门子PLC数据 使用TCP/IP 协议相关推荐

  1. C#读写三菱PLC数据 使用TCP/IP 协议

    本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...

  2. java android 读写三菱PLC 使用TCP/IP 协议

    本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...

  3. 三菱plc232数据线驱动下载_三菱PLC与西门子PLC有什么区别?

    三菱PLC与西门子PLC有什么区别?分别有什么优点和缺点?该如何选择?学习哪种品牌?首先它们的编程理念不同,三菱PLC是日系品牌,编程直观易懂,学习起来会比较轻松,西门子PLC是德国品牌,指令比较抽象 ...

  4. 三菱模块增益和偏置调整步骤_三菱PLC与西门子plc的模拟量编程详解

    三菱PLC与西门子plc的模拟量编程详解 Date:2015-01-01 origin:RCCN上海日成 Visit:2413 三菱和西门子的PLC都有自己的独特的长处的,先讲讲三菱2AD模块吧,2A ...

  5. fanuc机器人与plc的通讯_三菱PLC与西门子PLC有什么区别?

    点击↑↑技成培训 ,关注并置顶即可长期免费订阅20万+工控人关注的微信平台:技术分享.学习交流.工控视频三菱PLC与西门子PLC有什么区别?分别有什么优点和缺点?该如何选择?学习哪种品牌?首先它们的编 ...

  6. 上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,

    上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通讯,, ...

  7. 上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯

    上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通讯,, ...

  8. 上位机与PLC 通讯源码DEMO 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制

    上位机与PLC 通讯源码DEMO 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通 ...

  9. 西门子PLC编程,西门子PLC远程下载

    西门子PLC编程,西门子PLC远程下载 到了该介绍西门子plc利用STEP7软件编程时,组态通讯和下载用户程序方法的时分了.为了完成plc与计算机的通讯,一般选用PC/PPI多处扇电缆或USB/PPI ...

最新文章

  1. html5调用手机摄像头,实现拍照上传功能
  2. SAP 采购订单税金抓取方法
  3. 前端学习(2549):模板解析指令
  4. SQL Server 自定义函数 返回树结构函数
  5. 使用JS清空fileupload 控件值
  6. C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)
  7. cgi一键还原 linux分区,用一键恢复CGI工具备份还原分区和硬盘使用图文教程
  8. 旭荣管理软件怎么修改小票内容_水果门店管理系统怎么管理水果门店的
  9. 荣光医院药剂实验室全配方
  10. Win7 64位重装系统之后,IE11安装失败、升级失败之解决办法
  11. java project 显示感叹号_项目工程上有感叹号或者差号
  12. 如何用C语言开发图形化游戏
  13. 吉米小轻杆吸尘器轻巧便利顺手吸尘,利用碎片化时间让家居更洁净
  14. 架构 | 如何从零开始搭建高性能直播平台?
  15. 让chrome浏览器变成在线编辑器
  16. 安卓APP源码和设计报告——魔幻相机
  17. 微信小程序-模板与配置
  18. 关于The remote certificate is invalid according to the validation procedure(远程证书验证过程无效)的解决方案
  19. App性能测试Case
  20. 北大计算机博士蔡华谦,信科师生在北京大学国球联赛再次折桂

热门文章

  1. 一句话木马绕过检测的常见思路
  2. 物联网常见通信协议RFID、NFC、Bluetooth、ZigBee等梳理
  3. Excel计数非零数值
  4. 计算机病毒近年相似,计算机病毒入侵检测与防治研究 毕业论文
  5. 中学生怎样才能合理使用计算机,运用计算机技术提高中学生学习效率的精编.doc...
  6. 线性代数基础和英文表述【02】:矩阵的表述和初等行变换【第4-9】Matrix Notation Row Operations REF,RREF
  7. Android DDMS如何使用
  8. vue 基于MediaRecorder+canvas实现视频录屏
  9. 会玩,使用 init 进程运行 Container
  10. vue的随意拖拽插件