C# SerialPort 读写三菱FX系列PLC
1:串口初始化
com = new SerialPort("COM3", , Parity.Even, , StopBits.One);
2:打开关闭串口
if (com.IsOpen)
{
com.Close();//关闭
} com.Open();//打开
3:C# ASCII转字符及字符转ASCII
public static string Chr(int asciiCode)
{
if (asciiCode >= && asciiCode <= )
{
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 == )
{
System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
int intAsciiCode = (int)asciiEncoding.GetBytes(character)[];
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 = ;
for (int i = ; i < data.Length; i++)
{
sum += Asc(data.Substring(i, ));
} string res = sum.ToString("X");
res = res.Substring(res.Length - , ); return res;
}
5:写入PLC
private void btnWrite_Click(object sender, EventArgs e)
{
string[] write = new string[] { "",""}; //将准备写入PLC的值
//将要写入的值转换成16进制数,补齐两个字节,注意高低字节需要交换
string sWriteData = "";
for (int i = ; i < write.Length; i++)
{
int val = Convert.ToInt32(write[i].Length>?write[i]:"");
string s = val.ToString("X");
while (s.Length<)
{
s = "" + s;
}
sWriteData += s.Substring(,)+s.Substring(,);
} MessageBox.Show(sWriteData);
//写入命令,1表示写入,1194表示D202这个地址的16进制,04表示D202,D203为4个BYTE,1194=(202*2)+4096的16进制数,至于用它表示D202的起始位置,三菱故意要这么麻烦了.
sWriteData = "" + sWriteData + Chr();
//chr(2)和chr(3)是构成命令的标志字符,然后加上校验和,命令组织完成
sWriteData = Chr() + 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() + "" + Chr() + "";
com.Write(sReadCmd);
//等待1秒钟
System.Threading.Thread.Sleep();
// 从串口读数据
byte[] data = new byte[];
com.Read(data, , ); //如果首位为2,则表示数据有效.这里有个问题,在第二次读,第2位才为'2',第三次又是首位为2,需要再测试
if (data[]==)
{
string sReceiveData = System.Text.Encoding.ASCII.GetString(data);
//MessageBox.Show(sReceiveData);
//解析命令,将读到的字符解析成数字,注意高低位的转换
for (int i = ; i < ; i += )
{
string sLow = sReceiveData.Substring(i,);
string sHigh = sReceiveData.Substring(i + , );
//int res = Convert.ToInt32(sHigh)+ Convert.ToInt32(sLow);
int res = Convert.ToInt32(sHigh,) + Convert.ToInt32(sLow,); this.txtRead0.Text += res.ToString() + ",";
} }
C# SerialPort 读写三菱FX系列PLC的更多相关文章
- 三菱FX系列PLC教程
标 题 日 期 点击 第一章:可编程控制器概论 2014-11-04 1401 1-0 课程概述 2014-11-05 192237 1-1 PLC的定义功能与特点 2014-11-05 16 ...
- 三菱FX系列PLC学习
1.PLC工作原理 PLC将程序存储在用户存储器当中, 驱动其运行, 相对比微型计算机软件, PLC程序则不同的是, 微型计算机整个流程则是从规定的开始 至结束完整工作流程.相对与PLC运行,则是从位 ...
- C#读写三菱Fx PLC 使用Fx 串口协议 读写Fx3U设备
本文将使用一个Github开源的组件库技术来读写三菱 FX PLC,使用的是基于串口的实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地 ...
- 上位机开发之三菱Q系列PLC通信实践
经常关注我们公众号或者公开课的学员(如果还没有关注的话,左上角点击一波关注)应该知道,我们会经常使用西门子PLC,其实对于其他品牌的PLC,我们都会讲到,包括三菱.欧姆龙.基恩士.松下及国产台达.信捷 ...
- WeinView 与 MITSUBISHI FX 系列 PLC 通讯范例
1. 范例操作概述 此范例将介绍如何快捷简易地建立WEINVIEW HMI与MITSUBISHI FX系列 PLC通讯. 注意事项:通讯参数设置,通讯线接法. 2. 规划说明 (1) 新建简单 PLC ...
- 三菱Q系列PLC的智能功能模块程序
一.模拟量输入模块Q64AD 1.模块开关或者参数设置 1.1I/O分配 1.2开关设置使用通道1,0-5v, 1.3使用GX configurator设置自动刷新PLC设置智能功能模块参数,即将模拟 ...
- 三菱Q系列PLC基本指令讲解
1.数据传送指令MOV和MOVP,格式为 MOV SRC1 DES1 表示条件接通,将SRC1的值传送到DES1寄存器中,带P的表示只在条件接通的上升沿指令执行一个扫描周期,不带P ...
- 三菱Q系列PLC的io分配
1.系统基本配置 2.存储卡配置 3.外部IO标号 4.主基板IO模块的IO号分配 5.扩展基板IO口标号 6.标准配置实例 7. 一.输入采样阶段 在输入采样阶段,可编程逻辑控制器以扫描方式依次地读 ...
- C#读写三菱PLC和西门子PLC数据 使用TCP/IP 协议
本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能 ...
随机推荐
- JavaScript—面向对象 贪吃蛇最终
效果 代码 //食物对象 ;(function () { function Food(element) { this.width = 20 this.height = 20 this.backgrou ...
- App的布局管理
今天学习了布局管理器,格局自己的学习内容和课程,我主要学习了两种管理布局方式 一:LinearLayout线性布局 线性布局是指布局里面的内容成线性排列,有两种排列方式,横向排列和纵向排列,而排列方式 ...
- Paper Review: Epigenetic Landscape, Cell Differentiation 02
I'll share another review paper about Epigenetic Landscape, it comes from Nature Review, published i ...
- idea中maven项目依赖jar一直标红线
网上maven仓库中无法下载某些jar包,这时候就需要手动下载,并导入maven, 导入命令demo: mvn install:install-file -DgroupId=javax.media - ...
- 上传本地项目到GIT码云
1.下载GIT 下载地址:https://git-scm.com/downloads 我这里下载的64位 2.安装GIT 双击下载的Git-2.18.0-64-bit.exe文件,选择自己的安装目录, ...
- 处理Ajax请求跨域问题
ajax跨域的原理 ajax出现请求跨域错误问题,主要原因就是因为浏览器的“同源策略”. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resourc ...
- YOLO配置文件理解
[net] batch=64 每batch个样本更新一次参数. subdivisions=8 如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batc ...
- linux复制指定文件
find /somedir -type f|xargs -I {} cp {} . find /somedir -name "*.txt"|xargs -I {} cp {} .
- 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇四:配置Robbin负载均衡)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...
- vue 利用axios请求接口下载excel
一般有三种方法: 方法一: 通过a标签下载 // href为文件的存储路径或者地址,download为问文件名 <a href="/images/download.jpg" ...