C# SerialPort 读写三菱FX系列PLC
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() + ",";
}
}
关注 - 0
粉丝 - 3
» 下一篇:MSComm控件使用详解
FeedBack:
我也在用这东西FX2N(RS232),他给的手册好像不是这样说的。。。。
手册示例:
在第5站从X040向X077读32个点的数据(消息等待时间设为100毫秒)
应该向PLC发送:
ENQ 站号 PC号 读写指令 响应时间 起始地址 读取位数 和校验码
ENQ 0 5 F F W R 0 X 0 0 4 0 0 2 4 8
05H 30H 35H 46H 46H 57H 52H 30H 58H 30H 30H 34H 30H 30H 32H 34H 38H
我发送
m_ComPort.COM.Write(ASCIIEncoding.ASCII.GetString(byteTmp) + "FFWR0X004002" + SumChk("FFWR0X004002"));
可是获取不到正确的数据
X地址是不是要先加一个128?
不过没太看明白
格式如下(中间用“|”人为分割):
在第5站从X040向X077读32个点的数据(消息等待时间设为100毫秒)
ENQ|站号|PC号|读写指令|响应时间|起始地址|读取位数|和校验码
ENQ|0 5 |F F|W R|0 |X 0 0 4 0| 0 2| 4 8
05H|30H 35H |46H 46H |57H 52H |30H |58H 30H 30H 34H 30H |30H 32H|34H 38H
我写的代码:
m_ComPort.COM.Write(Chr(5) + "FFWR0X004002" + SumChk("FFWR0X004002"));
X地址加一个128?
是不是X0040转换成ASC之后加128
//
由于没有寄存器类型信息,所以地址的计算十分关键,如D100和M100分别对应哪个地址呢?下面就是三菱Fx系列PLC地址对应表:
Public Const PLC_D_Base_AddRess = 4096
Public Const PLC_D_Special_Base_AddRess = 3584
Public Const PLC_Y_Group_Base_AddRess = 160
Public Const PLC_PY_Group_Base_AddRess = 672
Public Const PLC_T_Group_Base_AddRess = 192
Public Const PLC_OT_Group_Base_AddRess = 704
Public Const PLC_RT_Group_Base_AddRess = 1216
Public Const PLC_M_SINGLE_Base_AddRess = 2048(命令为7或8时)
Public Const PLC_M_Group_Base_AddRess = 256
Public Const PLC_PM_Group_Base_AddRess = 768
Public Const PLC_S_Group_Base_AddRess = 0
Public Const PLC_X_Group_Base_AddRess = 128
Public Const PLC_C_Group_Base_AddRess = 448
Public Const PLC_OC_Group_Base_AddRess = 960
Public Const PLC_RC_Group_Base_AddRess = 1472
Public Const PLC_TV_Group_Base_AddRess = 2048
Public Const PLC_CV16_Group_Base_AddRess = 2560
Public Const PLC_CV32_Group_Base_AddRess = 3072
当我们用DEVICE READ命令时,D100地址=100*2+4096;M100地址=100+256;不同的是D类型寄存器存放的是字,M寄存器存放的是位,同样是读两个字节,D100返回的就是PLC中D100地址的值,M类型寄存器返回的是M100到M116的值。所以当我们用FORCE ON 命令时,M100寄存器地址=100+2048;
这也没有什么复杂的,不是吗?可是三菱公司好像不甘于如此,FORCE ON/Off命令中地址排列与DEVICE READ/WRITE不同,是低位在前高位在后。如Y20,地址是0510H,代码中4个字节地址表示为:1005。(注意:Y寄存器为八进制,如Y20 地址=16+1280=0510H)
其实一点技术含量都没有,就是拐了几个弯,偏偏很多时候又不都告诉你,让人浪费不少时间。
和厂商通过另外一种模式解决了
因为时间实在太急,对于这些东西懂得也不多,就没能继续研究
假设读2个地址,那是不是应该以"0180004"开始,手里没有PLC,也没有试过从1024开始,所以也就不确定了.
C# SerialPort 读写三菱FX系列PLC相关推荐
- 三菱FX 系列PLC 编程通信协议总览
三菱FX 系列PLC 编程口通信协议总览 该协议实际上适用于PLC 编程端口以及 FX-232AW 模块的通信 通讯格式 命令 命令码 目标设备 DEVICE READ CMD "0&quo ...
- 三菱FX系列PLC串口通讯协议整理
三菱FX系列PLC串口通讯协议整理 记录原因 项目要求 工具与资料 通讯格式 读寄存器 写寄存器 PLC回复数据 最后附几张上位机截图 记录原因 因项目需求,要写上位机与PLC进行通讯,查了诸多资料与 ...
- 三菱je-a系列伺服支持modbusrtu 协议吗_入门课程 | 三菱FX系列PLC的软元件介绍
点击箭头处"工业之家",选择"关注公众号"! 三菱FX系列PLC的软元件介绍 PLC的软元件很多,主要有输入继电器.输出继电器.定时器.计数器.数据寄存器和常 ...
- 三菱FX系列PLC以太网连接力控ForceControl
三菱FX系列PLC,包括FX1N.FX2N.FX3U.FX3S.FX3G等:可以通过MCTCP以太网连接力控软件ForceControl. 配置步骤: 1.新建IO设备,这里选择A.ANA系列以太网驱 ...
- 三菱FX系列PLC简单总结
点击 三菱FX系列PLC简单总结 关注微信公众号:小平Linux工作室 获得"0基础学习PLC电气电工知识.数据结构与算法,STC89C51知识,嵌入式STM32.嵌入式Linux C/C+ ...
- 三菱FX系列PLC以太网通讯
三菱FX系列PLC以太网通讯 BCBet-FX用于三菱FX1N/1S/2N/3U/3G/3S等系列PLC,以及汇川.禾川.士林等品牌PLC. BCBet-FX 以太网模块采用三通设计,不占用PLC通讯 ...
- 三菱FX系列PLC以太网连接kepwareopc软件
三菱FX系列PLC,包括FX1N.FX2N.FX3U.FX3S.FX3G等:可以通过MCTCP以太网连接kepwareopc软件. 配置步骤: 1.新建channel,选择Mitsubishi Eth ...
- 三菱FX系列PLC以太网连接西门子wincc软件
三菱FX系列PLC以太网连接西门子wincc软件 三菱FX系列PLC,包括FX1N.FX2N.FX3U.FX3S.FX3G等:可以通过MCTCP和ModbusTCP两种以太网方式连接西门子wincc软 ...
- 三菱FX系列PLC以太网连接杰控FameView
三菱FX系列PLC,包括FX1N.FX2N.FX3U.FX3S.FX3G等:可以通过MCTCP以太网连接杰控FameView软件. 配置步骤: 1.选择[设备通讯]下的[安装驱动],这里选择MC-FX ...
最新文章
- 为图片添加半透明遮罩效果
- 【C 语言】文件操作 ( 读取文件中的结构体数组 | feof 函数使用注意事项 )
- ctf图片隐写之修改图片高度
- 心路历程:「双非」研究生数据分析春招
- 微服务技术栈:API网关中心,落地实现方案
- Spring-tx-TransactionInterceptor类
- Server Tomcat v8.0 Server at localhost failed to start.
- 5G网络切片的七种武器(六)
- 大数据揭秘| 《少年的你》大火之后,流量明星对电影意味着什么?
- V型滤池类毕业论文文献包含哪些?
- 使用Arduino连接一个LCD显示屏
- 数据库电话号码查询显示中间四位用****代替的SQL语句
- 始终从最不易改变的方面开始
- Mysql优势和特点
- 论文不记之《StyleNet: Generating Attractive Visual Captions with Styles》
- VC - vs2017里poco的websocket使用netssl
- 《基础会计学》|绪论一
- 为subclipse配置http代理,解决“RA layer request failed, Unable to connect to a repository at URL ... 错误
- python五子棋ai棋力最高_Python实现AI五子棋
- Android屏幕适配 - 屏幕基础理论知识笔记;res资源文件命名与匹配规则
热门文章
- latex的 多行注释_Latex图形注释的实现方法
- java web 手机验证_Java 手机Web开发 身份验证
- html input 字体颜色_input使用小技巧
- mysql的root用户密码_MySQL的root用户密码忘了 , 该怎么办?
- html文字斜体变成正体,$$中的字母如何由斜体变成正体?
- 完全相同的4个小矩形如图所示放置_短线投资,遇到“矩形突破”,斩钉截铁满仓干!...
- mysql 缓存监控_MySql 缓存查询原理与缓存监控 和 索引监控
- servlet容器_Servlet详解(一)之基本概念
- rs232转usb驱动for server 2008_电子史 · 什么插头是需要转一圈才能插进去的?
- 11旋转编码器原理_旋转编码器的原理是什么?增量式编码器和绝对式编码器有什么区别?...