C# SerialPort 读写三菱FX系列PLC

1:串口初始化

com = new SerialPort("COM3", 9600, Parity.Even, 7, StopBits.One);

2:打开关闭串口

 1 if (com.IsOpen)
 2 {
 3     com.Close();//关闭
 4 }
 5
 6 com.Open();//打开

3:C# ASCII转字符及字符转ASCII

 1 public static string Chr(int asciiCode)
 2 {
 3   if (asciiCode >= 0 && asciiCode <= 255)
 4   {
 5     System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
 6     byte[] byteArray = new byte[] { (byte)asciiCode };
 7     string strCharacter = asciiEncoding.GetString(byteArray);
 8     return (strCharacter);
 9   }
10   else
11   {
12     throw new Exception("ASCII Code is not valid.");
13   }
14 }
15
16
17
18 public static int Asc(string character)
19 {
20   if (character.Length == 1)
21   {
22     System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
23     int intAsciiCode = (int)asciiEncoding.GetBytes(character)[0];
24     return (intAsciiCode);
25   }
26   else
27   {
28     throw new Exception("Character is not valid.");
29   }
30 }

4:写入串口的命令字符串的和校验

 1      /// <summary>
 2         /// 写入串口的命令字符串的和校验
 3         /// </summary>
 4         /// <param name="data"></param>
 5         /// <returns></returns>
 6         public string SumCheck(string data)
 7         {
 8             int sum = 0;
 9             for (int i = 0; i < data.Length; i++)
10             {
11                 sum += Asc(data.Substring(i, 1));
12             }
13
14             string res = sum.ToString("X");
15             res = res.Substring(res.Length - 2, 2);
16
17             return res;
18         }

5:写入PLC

 1      private void btnWrite_Click(object sender, EventArgs e)
 2         {
 3             string[] write = new string[] { "2","2"}; //将准备写入PLC的值
 4             //将要写入的值转换成16进制数,补齐两个字节,注意高低字节需要交换
 5             string sWriteData = "";
 6             for (int i = 0; i < write.Length; i++)
 7             {
 8                 int val = Convert.ToInt32(write[i].Length>0?write[i]:"0");
 9                 string s = val.ToString("X");
10                 while (s.Length<4)
11                 {
12                     s = "0" + s;
13                 }
14                 sWriteData += s.Substring(2,2)+s.Substring(0,2);
15             }
16
17             MessageBox.Show(sWriteData);
18             //写入命令,1表示写入,1194表示D202这个地址的16进制,04表示D202,D203为4个BYTE,1194=(202*2)+4096的16进制数,至于用它表示D202的起始位置,三菱故意要这么麻烦了.
19             sWriteData = "1119404" + sWriteData + Chr(3);
20             //chr(2)和chr(3)是构成命令的标志字符,然后加上校验和,命令组织完成
21             sWriteData = Chr(2) + sWriteData + SumCheck(sWriteData);
22
23             MessageBox.Show(sWriteData);
24             //写入串口
25             com.Write(sWriteData);
26             //byte[] data = Encoding.ASCII.GetBytes(sWriteData);
27             //com.Write(data,0,data.Length);
28         }

6:读PLC

 1       private void btnRead_Click(object sender, EventArgs e)
 2         {
 3
 4             this.txtRead0.Clear();
 5             string sReadData = "";
 6             //在读PLC中的数据之前,需要先发个指令给它,让它将数据发送到串口,下面的字符串中,chr(2),chr(3)为PLC命令的格式标志,0119404中,0表示读,1194表示D202的起始地址,04表示读D202,D203两个字,共4个字节,66为0119404和chr(3)的校验和,向串口写入"读"命令,其实和向plc地址中写入数据是一样的,只是没有数据,用0表示读
 7             string sReadCmd = Chr(2) + "0119404" + Chr(3) + "66";
 8             com.Write(sReadCmd);
 9             //等待1秒钟
10             System.Threading.Thread.Sleep(1000);
11             // 从串口读数据
12             byte[] data = new byte[1024];
13             com.Read(data, 0, 1024);
14
15            //如果首位为2,则表示数据有效.这里有个问题,在第二次读,第2位才为‘2‘,第三次又是首位为2,需要再测试
16             if (data[0]==2)
17             {
18                 string sReceiveData = System.Text.Encoding.ASCII.GetString(data);
19                 //MessageBox.Show(sReceiveData);
20                //解析命令,将读到的字符解析成数字,注意高低位的转换
21                 for (int i = 1; i < 8; i += 4)
22                 {
23                     string sLow = sReceiveData.Substring(i,2);
24                     string sHigh = sReceiveData.Substring(i + 2, 2);
25                     //int res = Convert.ToInt32(sHigh)+ Convert.ToInt32(sLow);
26                     int res = Convert.ToInt32(sHigh,16) + Convert.ToInt32(sLow,16);
27
28                     this.txtRead0.Text += res.ToString() + ",";
29                 }
30
31             }

原文地址:https://www.cnblogs.com/ybqjymy/p/12170688.html

时间: 2024-10-08 06:32:45

C# SerialPort 读写三菱FX系列PLC的相关文章

plc指令表与解释(基于三菱 FX 系列PLC)

三菱 FX 系列PLC的基本逻辑指令. 取指令与输出指令(LD/LDI/LDP/LDF/OUT) (1)LD(取指令) 一个常开触点与左母线连接的指令,每一个以常开触点开始的逻辑行都用此指令. (2)LDI(取反指令) 一个常闭触点与左母线连接指令,每一个以常闭触点开始的逻辑行都用此指令. (3)LDP(取上升沿指令) 与左母线连接的常开触点的上升沿检测指令,仅在指定位元件的上升沿(由OFF→ON)时接通一个扫描周期. (4)LDF(取下降沿指令) 与左母线连接的常闭触点的下降沿检测指令. (5

三菱Q系列PLC MC通讯

总结一下上位机通过MC协议与Q系列PLC通讯的配置.现场碰到的硬件有两种一种是自带网口的CPU如Q06UDEH,另一种是使用网络模块QJ71E71-100. 一. PLC端设定 1.1 自带网口的CPU GX Works 软件打开[参数]-->>[PLC参数]-->>[内置以太网端口设置]配置IP,协议格式等参数. 然后进[打开设置],如下是按TCP协议开放了两个供上位机MC协议的端口. 这样PLC端的配置就结束了. 1.2 使用网络模块QJ71E71-100通讯(界面与上述的内置

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

本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持,打赏请认准源代码项目. 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安

python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据

本文将使用一个gitHub开源的组件技术来读写三菱的plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://github.com/dathlin/HslCommunication                             如果喜欢可以star或是fork,还可以打赏支持. 官网地址:http://www.hslcommunication.cn/         

KepServerEX读写三菱PLC,车间现场测试记录,带你了解【数据采集的困境】的前世与今生

1.不了解KepServerEX 的鞋童,可以先了解一下OPC UA,OPC UA服务端.我们当前项目读写三菱PLC是自己写的类库,但我感觉调用不够方便灵活,工作之余用OPC UA方式尝试一下 2.数据采集的困境:理想很丰满,现实很骨感. 3.存在即是合理的,OPC UA的方式的本质是想以一种统一的方式,以结束现在这种,五门八门的协议采集,以降低采集成本,降低门槛,加快工业互联的脚步. 5.现在很多著名的设备大厂商纷纷也加入了OPC UA的队伍,让自家的新设备支持OPC UA的方式进行通信.但现

S7-200系列PLC与WINCC以太网通信CP243i的实例

S7-200系列PLC与WINCC以太网通信CP243i的实例 ----选用大连德嘉国际电子www.dl-winbest.cn的CP243i作为连接S7-200的PPI口转以太网RJ45的接口转换器.如下图所示: 一.   硬件连接: 将CP243i的两端分别与S7-200的PPI口和以太网线连接(上图使用的是交叉网线,如果中间加交换机就要用直连网线,注:我们平时用的都是直连型网线) 二.   监控计算机的软件设置: a.OPC—西门子PC_Access的设置: S7-200一般都是通过PC_A

西门子S7系列PLC的主要种类及应用软件

德国西门子(SIEMENS)公司生产的可编程序控制器在我国的应用也相当广泛,在冶金.化工.印刷生产线等领域都有应用.西门子(SIEMENS)公司的PLC产品包括LOGO,S7-200,S7-300,S7-400,工业网络,HMI人机界面,工业软件等. 西门子S7系列PLC体积小.速度快.标准化,具有网络通信能力,功能更强,可靠性更高.S7系列PLC产品可分为微型PLC(如S7-200),小规模性能要求的PLC(如S7-300)和中.高性能要求的PLC(如S7-400)等. 1.SIMATIC S

三菱FX PLC编程口通讯协议详解

因工程需要,需要了解三菱PLC编程口通讯协议,以为后续的上位机串口通讯打下相关基础-- 毕竟首次接触此类通讯,对其原理不甚了解,导致走了不少弯路,故记下之,以免忘记. 需要工具与资料: GXDeveloper 串口通讯助手 编程口通讯协议手册(小子只仅找到繁体版本,且为影印版:若谁有文字版的原版,请留下相关资料,以利广大工控人学习) 能找到此文章的,软件各位应该都是备齐了,若没有,请自行查找: 通讯协议  下载地址: http://www.ymmfa.com/read-gktid-1564754

模拟量编程详解——三菱FX2N系列

前几期,我们发表过西门子PLC的模拟量手把手教学文,发现大家很感兴趣,也有不少朋友给我们留言需要我们发表些三菱PLC的,苦于事多,力不从心!今天熬夜,把这空缺补上!(熬夜伤身,记得多给我们鸡腿补补) 先用例子来引导 有一个压力变送器,量程为0-20MPa,输出信号为0-10V.PLC借助FX2N-2AD的模拟量输入模块,将压力值传送给上位机显示. 其中的FX2N-2AD模块的量程为0-10V,转换后的数字量为0-4000,(这个0~4000,是FX2N-2AD模块的输出特性,也就是线性比的数据值