C# SerialPort 读写三菱FX系列PLC

c# 实现PC与PLC(三菱Fx系列)串口通信 串口是计算机上一种非常通用的设备通信协议。 大多数计算机包含两个基于RS-232的串口。 PLC采用的是三菱公司的FX1N©系列产品,支持的串口通信协议是422,不支持232协议, 所以要调用第三方提供的动态库实现PC与PLC之间串口通信。 首先到三菱官网 下载软件,测试PC与PLC的通信。 注:点击图中的查看并下载,软件安装过程中需要序列号,可以在官网通过注册账号获得。 安装完成后,打开PL... 阅读详情

1:串口初始化 

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

2:打开关闭串口

if (com.IsOpen)

 {com.Close();}

com.Open();

 

if (com.IsOpen)

{ com.Close();}

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

public static string Chr(int asciiCode)
        {
            if (asciiCode >= 0 && asciiCode <= 255)
            {
                System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
                byte[] byteArray = new byte[] { (byte)asciiCode };
                string strCharacter = asciiEncoding.GetString(byteArray);
                return (strCharacter);
            }
            else
            {
                throw new Exception("ASCII Code is not valid.");
            }

        }

 

public static int Asc(string character)
        {
            if (character.Length == 1)
            {
                System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
                int intAsciiCode = (int)asciiEncoding.GetBytes(character)[0];
                return (intAsciiCode);
            }
            else
            {
                throw new Exception("Character is not valid.");
            }

        }

 

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

 

/// <summary>
        /// 和校验
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public string SumCheck(string data)
        {
            int sum = 0;
            for (int i = 0; i < data.Length; i++)
            {
                sum += Asc(data.Substring(i, 1));
            }

            string res = sum.ToString("X");
            res = res.Substring(res.Length - 2, 2);

            return res;

        }

 

 5:写入PLC

private void btnWrite_Click(object sender, EventArgs e)

        {

            string[] write = new string[] { "2","2"}; //将准备写入PLC的值
            //将要写入的值转换成16进制数,补齐两个字节,注意高低字节需要交换
            string sWriteData = "";
            for (int i = 0; i < write.Length; i++)
            {
                int val = Convert.ToInt32(write[i].Length>0?write[i]:"0");
                string s = val.ToString("X");
                while (s.Length<4)
                {
                    s = "0" + s;
                }
                sWriteData += s.Substring(2,2)+s.Substring(0,2);
            }

            MessageBox.Show(sWriteData);
            //写入命令,1表示写入,1194表示D202这个地址的16进制,04表示D202,D203为4个BYTE,1194=(202*2)+4096的16进制数,至于用它表示D202的起始位置,三菱故意要这么麻烦了.
            sWriteData = "1119404" + sWriteData + Chr(3);
            //chr(2)和chr(3)是构成命令的标志字符,然后加上校验和,命令组织完成
            sWriteData = Chr(2) + sWriteData + SumCheck(sWriteData);

            MessageBox.Show(sWriteData);
            //写入串口
            com.Write(sWriteData);
            //byte[] data = Encoding.ASCII.GetBytes(sWriteData);
            //com.Write(data,0,data.Length);

        }

 

6:读PLC

 private void btnRead_Click(object sender, EventArgs e)
        {
           
            this.txtRead0.Clear();
            string sReadData = "";

            //在读PLC中的数据之前,需要先发个指令给它,让它将数据发送到串口,下面的字符串中,chr(2),chr(3)为PLC命令的格式标志,0119404中,0表示读,1194表示D202的起始地址,04表示读D202,D203两个字,共4个字节,66为0119404和chr(3)的校验和,向串口写入"读"命令,其实和向plc地址中写入数据是一样的,只是没有数据,用0表示读

            string sReadCmd = Chr(2) + "0119404" + Chr(3) + "66";
            com.Write(sReadCmd);
            //等待1秒钟
            System.Threading.Thread.Sleep(1000);
            // 从串口读数据
            byte[] data = new byte[1024];
            com.Read(data, 0, 1024);

           //如果首位为2,则表示数据有效.这里有个问题,在第二次读,第2位才为'2',第三次又是首位为2,需要再测试
            if (data[0]==2)
            {
                string sReceiveData = System.Text.Encoding.ASCII.GetString(data);
                //MessageBox.Show(sReceiveData);
               //解析命令,将读到的字符解析成数字,注意高低位的转换
                for (int i = 1; i < 8; i += 4)
                {
                    string sLow = sReceiveData.Substring(i,2);
                    string sHigh = sReceiveData.Substring(i + 2, 2);
                    //int res = Convert.ToInt32(sHigh)+ Convert.ToInt32(sLow);
                    int res = Convert.ToInt32(sHigh,16) + Convert.ToInt32(sLow,16);

                    this.txtRead0.Text += res.ToString() + ",";
                }              
                
            }

在C#程序中三菱PLC读写数据 读写PLC交互 阅读详情

相关推荐

C#使用HslCommunication与PLC建立通讯(以三菱FX5U举例)

HslCommunication.dll是市场上最主流的与PLC连接通讯的方式。它对PLC的品牌覆盖面广,读写效率高。

气氛组,yyds 2万+

C#读写三菱PLC数据 使用TCP/IP 协议 全开源 c#零基础快速对接三菱PLC c#快速开发三菱PLC上位机 c#MC协议

本例子读写三菱PLC数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 1)支持三菱Q系统 MC协议A-1E通信 2)支持三菱Q系统 MC协议Qna-3E通信 3)附件C#代码全开源,所有代码公开,不使用第三方组件。

C#读写三菱Fx PLC 使用Fx 串口协议 读写Fx3U设备

本文将使用一个Github开源的组件库技术来读写三菱 FX PLC,使用的是基于串口的实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://github.com/dathlin/HslCommunication如果喜欢可以star或是fork,还可以打赏支持,打赏请认准源代码项目。 官网:http://www.h...

weixin_30682127的博客 3216

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

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

thsgod的专栏 6472

C#与三菱PLC串口通讯源码详解:FX编程口协议与上位机实战

在工业自动化与设备联网场景中,上位机与PLC的数据交互是MES、SCADA及产线数据采集的基础。串口通讯作为一种低成本、高兼容的物理链路,在老旧设备改造和现场调试中依然扮演关键角色。C#凭借System.IO.Ports的简洁封装,成为快速实现上位机通讯的主流选择。理解协议帧结构、地址换算与校验算法,是稳定通讯的核心。本文以三菱FX系列PLC编程口协议为切入点,剖析从串口参数配置、D寄存器读写到异常排查的完整过程,并延伸到变频器控制、步进电机等扩展应用,帮助工程师掌握一套可复用的串口通讯源码与调试方法论。无

weixin_29305337的博客 352

三菱FX系列PLC与PC通讯实战:C#上位机串口读写与协议解析

工业自动化现场,上位机与PLC的通讯是设备控制的基础环节。串口作为最经典的物理链路,以其简单可靠广泛应用于中低端设备。理解通讯协议、帧结构、校验和计算,是打通数据链路的关键。三菱FX系列PLC作为老牌控制器,其计算机链接协议结构清晰,通过RS232/RS485接口可轻松实现与PC的数据交换。从物理链路选型、PLC侧D8120参数配置,到C#上位机实现D寄存器读写,给出完整的代码示例与排查思路。掌握这套方法论,无论是设备调试还是后续扩展到变频器分层通讯,都能事半功倍。重点讲解三菱FX系列PLC与PC通讯的完整

weixin_31887307的博客 309

C#语言与三菱PLC串口通讯

VB、C#等高级语言与三菱PLC(Q系列、L系列、FX系列)串口、以太网通讯的DLL及源代码 1.0 通讯组件概述 通讯组件用于PC与可编程控制器(PLC)、智能仪表等进行数据通讯,适用于基于PC高级语言的工业自动化控制系统。组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工程里引用该组件,调用相应的属性与方法函数,即可快速实现PC与PLC的高效数据交换。 DLL通讯组件无须安...

WarGames_dc的博客 7955

C#与三菱PLC串口通讯实战:从协议解析到源码实现

在工业自动化和上位机开发领域,串口通讯一直是连接PC与PLC设备的经典方案。RS485、RS232等物理接口以其接线简单、抗干扰能力强、传输距离远等优势,在产线数据采集和设备控制场景中广泛使用。而C#凭借高效的WinForm/WPF界面开发能力、完善的System.IO.Ports类库支持,成为上位机通讯编程的主流选择。要实现上位机与三菱PLC的稳定通讯,关键在于理解串口报文结构、软元件地址映射规则、校验和算法,以及正确的帧解析逻辑。通过掌握这些底层原理,开发者可以灵活应对FX系列、Q系列等不同型号的通讯需

weixin_29214559的博客 319

用C#实现与三菱FX3U PLC的串口通讯

C#,C#与PLC,三菱PLC,FX3U串口通讯,支持最新的读写,支持波特率:9600和115200,不适合FX1.2系列,支持的有X,Y,M,T,C,S,D等寄存器读写,不需要了解底层协议在工业自动化领域,PLC(可编程逻辑控制器)扮演着至关重要的角色。而三菱的FX3U系列PLC更是应用广泛。今天咱们就聊聊如何用C#来实现与三菱FX3U PLC的串口通讯,而且无需深入了解底层协议哦。

YGkDOYjbiPA的博客 696

三菱FX3GA PLC串口通讯与C#实现详解

三菱电机生产的FX系列控制器以其稳定的性能、丰富的功能和简单的编程而闻名于自动化领域。本章节将为读者提供一个概述,涵盖FX系列控制器的核心特点,以及它们如何成为现代工业控制系统的中流砥柱。在C#编程中,类是.NET框架提供的一个用于串行通信的类。这个类封装了Windows API中的串行端口通信功能,提供了丰富的属性、方法和事件来管理串行端口的行为。SerialPort类允许开发者执行以下操作:- 配置串行端口的参数,如波特率、数据位、停止位和奇偶校验。- 打开和关闭串行端口。

weixin_35982453的博客 1120

C#实现三菱Q系列PLC通信协议实战详解

在工业自动化系统中,PLC作为控制核心承担着逻辑运算、设备驱动和数据交互的关键任务。三菱Q系列PLC凭借其高性能CPU模块、丰富的扩展能力和多样的通信接口(如RS-232、RS-485、以太网),广泛应用于复杂控制系统中。其内置的通信协议支持MODBUS、MC协议等标准,便于实现与上位机的数据交换。通过串行或网络通信,Q系列PLC可实现远程监控、实时数据采集与设备联动控制。采用C#进行通信开发,得益于.NET框架对SerialPort。

weixin_42627459的博客 1081
上一篇: DataGridView控件的列选中
下一篇: 该协议实际上适用于PLC编程端口以及 FX-232AW 模块的通信
lianchengzhang
博客等级 码龄18年 22粉丝 47原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值