模拟三菱FX2N系列PLC的串口通信(实测通过)
来源:互联网 发布:考勤软件免费下载 编辑:程序博客网 时间:2024/04/30 21:43
软件开发背景:由于项目需要,上位机软件与三菱FX2N系列PLC的串口交换数据时,但手头上又没有PLC硬件,所以开发了这样一个工具来当PLC使用。
/*
功能:模拟PLC的数据通信作者:
日期:2013-05-01
说明:
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
namespace CommAssist
{
public partial class Form1 : Form
{
public delegate void Displaydelegate(byte[] InputBuf);
Byte[] OutputBuf = new Byte[128];
Byte[] CommRcvBuf = new Byte[128];
int RcvCount = 0;
bool bFlagRcvOK=false;
bool RcvFlag = false;
SerialPort Comm = new SerialPort("com7", 19200, Parity.None, 8, StopBits.One);
public Displaydelegate disp_delegate;
public Form1()
{
disp_delegate = new Displaydelegate(DispUI);
InitializeComponent();
int mytemp;
comboBox1.SelectedItem = "com7";
Comm.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived);
string[] ports = SerialPort.GetPortNames();
Array.Sort(ports);
comboBox1.Items.AddRange(ports);
comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;
}
public void DispUI(byte[] InputBuf)
{
//textBox1.Text = Convert.ToString(InputBuf);
int i;
byte GetData;
for (i = 0; i < InputBuf[0]; i++)
{
if (!bFlagRcvOK)
{
GetData = InputBuf[1+i];
switch (RcvCount)
{
case 0: if (GetData == 0x05)
{
CommRcvBuf[RcvCount] = GetData;
RcvCount++;
}
else
RcvCount = 0;
break;
case 1: if (GetData == 0x30)
{
CommRcvBuf[RcvCount] = GetData;
RcvCount++;
}
else if (GetData == 0x05)
{
}
else
{
RcvCount = 0;
}
break;
case 2: if (GetData == 0x31)
{
CommRcvBuf[RcvCount] = GetData;
RcvCount++;
}
else
RcvCount = 0;
break;
case 3: if (GetData == 0x46)
{
CommRcvBuf[RcvCount] = GetData;
RcvCount++;
}
else
RcvCount = 0;
break;
case 4: if (GetData == 0x46)
{
CommRcvBuf[RcvCount] = GetData;
RcvCount++;
}
else
RcvCount = 0;
break;
default:
RcvFlag = true;
break;
}
if (RcvFlag) // receive valid data
{
RcvFlag = false;
CommRcvBuf[RcvCount] = GetData;
RcvCount++;
if (RcvCount >= 17)
{
//MessageBox.Show("收到串口数据"); test
//BtnTest_Click();
this.BtnTest_Click(null,null);
bFlagRcvOK = false; // 错误溢出处理
RcvCount = 0;
}
}
}
else
break;
}
ASCIIEncoding encoding = new ASCIIEncoding();
textBox1.Text= encoding.GetString(InputBuf);
//return (constructedString);
}
private void BtnTest_Click(object sender, EventArgs e) // 返回主机
{
int i;
string buf;
byte temp;
Byte[] sum = new Byte[10];
try
{
OutputBuf[0] = 0x02;
OutputBuf[1] = 0x30;
OutputBuf[2] = 0x31;
OutputBuf[3] = 0x46;
OutputBuf[4] = 0x46;
//-------------
OutputBuf[5] = 0x30;
OutputBuf[6] = 0x31;
OutputBuf[7] = 0x30;
OutputBuf[8] = 0x31;
OutputBuf[9] = 0x30;
OutputBuf[10] = 0x31;
OutputBuf[11] = 0x30;
OutputBuf[12] = 0x31;
OutputBuf[13] = 0x30;
OutputBuf[14] = 0x31;
OutputBuf[15] = 0x30;
OutputBuf[16] = 0x31;
OutputBuf[17] = 0x30;
OutputBuf[18] = 0x31;
OutputBuf[19] = 0x30;
OutputBuf[20] = 0x31;
OutputBuf[21] = 0x03;
sum[0] = 0;
for (i = 0; i < 21; i++)
sum[0] +=OutputBuf[i+1];
string str = BitConverter.ToString(sum);
OutputBuf[22] = (byte)str[0];
OutputBuf[23] = (byte)str[1];
Comm.Write(OutputBuf,0,24);
}
catch (TimeoutException ex) //异常处理
{
MessageBox.Show(ex.ToString());
}
}
void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int count,i;
Byte[] InputBuf = new Byte[128];
System.Threading.Thread.Sleep(20);
try
{
count = Comm.BytesToRead;
Comm.Read(InputBuf,0,Comm.BytesToRead);
for (i = 0; i < count; i++)
{
InputBuf[count - i] = InputBuf[count - i-1];
}
InputBuf[0] = (byte)count;
//InputBuf = UnicodeEncoding.Default.GetBytes(strRD);
//System.Threading.Thread.Sleep(50);
this.Invoke(disp_delegate, InputBuf);
}
catch (TimeoutException ex) //超时处理
{
MessageBox.Show(ex.ToString());
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //选择串口的处理过程
{
bool b_OpenFlag = Comm.IsOpen;
if (b_OpenFlag == true)
{
Comm.Close();
Comm.PortName = comboBox1.SelectedItem.ToString();
Comm.Open();
}
else
{
Comm.PortName = comboBox1.SelectedItem.ToString();
}
}
private void OpenSerialPort_Click(object sender, EventArgs e) //点击“打开串口”按钮的操作
{
if (OpenSerialPort.Text == "关闭串口")
{
Comm.Close();
OpenSerialPort.Text = "打开串口";
}
else
{
Comm.Open();
OpenSerialPort.Text = "关闭串口";
}
}
}
}
1 0
- 模拟三菱FX2N系列PLC的串口通信(实测通过)
- 三菱PLC(FX2N系列)基本指令
- 紫金桥与三菱FX2N系列PLC编程口通讯
- 三菱PLC 串口通信开发心得经验
- 三菱PLC FX系列编程口通信的若干问题
- 三菱 plc 网口 通信
- 三菱Q系列PLC的modbusTCP通讯
- 三菱FX系列PLC的modbusTCP通讯
- 三菱A系列PLC
- 欧姆龙PLC的FINS协议解释(实测通过)
- C#PC与三菱Q系列PLC通信小实验中遇到的问题
- 与三菱Q系列PLC-TCP通信(MC协议)学习总结
- PC与三菱FX系列PLC通信实例
- VC环境下三菱PLC与微机的串行通信
- 三菱Fx系列PLC的编程口协议
- 三菱PLC和PC机通过编程口串行通信实现
- 上位机与三菱PLC通信
- c#通过网线读取三菱PLC数据
- 360 手机为什么失败了?
- /etc/fstab文件小解
- Android 代码创建TextView需要注意的地方
- Android Studio系列教程二--基本设置与运行
- PCA-主成份分析实现流程
- 模拟三菱FX2N系列PLC的串口通信(实测通过)
- Oracle的坑真多
- 19Controlling Your App’s Volume and Playback
- 从SQL语言的分类谈COMMIT和ROLLBACK的用法
- digitalocean使用心得
- Spring MVC 3 最简单的入门例子
- Android Studio系列教程一--下载与安装
- 安卓系统源码编译系列(4)——LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_STATIC_LIBRARIES的区别浅析
- Lo4J配置指定包下的log输出级别和输入到指定位置