using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PanasonicPlcComPort;
using Base;
using System.IO.Ports;
using PanasonicPlcComPort.AnalysisCommand.IResult;
using PanasonicPlcComPort.AnalysisCommand;
using PanasonicPlcComPort.AnalysisCommand.Result;
using PanasonicPlcComPort.Command;
using System.Threading;
namespace PanasonicPLC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Initialize();
#region float类型转换成8位16进制
//float F = 0.125864f;
//var s1 = BitConverter.ToString(BitConverter.GetBytes(F)).Split(new char[] { '-'});
//string result1 = "";
//for (int i = 0; i < s1.Length; i++)
//{
// result1 += s1[i];
//}
#endregion
#region int类型转8位16进制
//int num = 1564651156;
//var s = num.ToString("X8");
//char[] ch = s.ToCharArray();
//char[] ch2 = new char[ch.Length];
//int cont = ch.Length / 2;
//int j = 0;
//int a = ch.Length - 1;
//for (int i = cont; i > 0; i--)
//{
// ch2[j] = ch[a - 1];
// ch2[j + 1] = ch[a];
// j += 2;
// a -= 2;
//}
//string result = new string(ch2);
#endregion
#region 4位16进制字符串转成short类型
//string strHex = "7B00";
//string strHex1 = strHex.Substring(0, 4).ToUpper();
//char[] hexDigits = strHex1.ToCharArray();
//char[] ch2 = new char[hexDigits.Length];
//int cont = hexDigits.Length / 2;
//int j = 0;
//int a = hexDigits.Length - 1;
//for (int i = cont; i > 0; i--)
//{
// ch2[j] = hexDigits[a - 1];
// ch2[j + 1] = hexDigits[a];
// j += 2;
// a -= 2;
//}
//string str = new string(ch2);
//var shor = Convert.ToInt16(str, 16);
#endregion
#region 测试
ResultRCS result = new ResultRCS();
result = AnalysisCommand.GetCommandRCS("%01$RC120");
ResultWCSWCPWCC result1 = new ResultWCSWCPWCC();
result1 = AnalysisCommand.GetCommandWCSWCPWCC("%01$WC14");
ResultRCP result2 = new ResultRCP();
result2 = AnalysisCommand.GetCommandRCP("%01$RC1111");
ResultRCC result3 = new ResultRCC();
result3 = AnalysisCommand.GetCommandRCC("%01$RC7B00341260");
ResultSC result4 = new ResultSC();
result4 = AnalysisCommand.GetCommandSC("%01$SC10");
ResultRD result5 = new ResultRD();
result5 = AnalysisCommand.GetCommandRD("%01$RD7B007B0034123412341234123412341234123412000016");
ResultWD result6 = new ResultWD();
result6 = AnalysisCommand.GetCommandWD("%01$WD13");
ResultSD result7 = new ResultSD();
result7 = AnalysisCommand.GetCommandSD("%01$SD17");
ResultRM result8 = new ResultRM();
result8 = AnalysisCommand.GetCommandRM("%01$RM1F");
IResult result9 = AnalysisCommand.GetCommandRD("%01$RD7B007B0034123412341234123412341234123412000016");
#endregion
}
private ComPort comPort;
private void Initialize()
{
this.cob_BaudRate.Items.AddRange(new object[] { "9600","14400","19200","38400","56000","57600","115200","128000","230400"});
this.cob_BaudRate.SelectedIndex = 6;
this.cob_DataBits.Items.AddRange(new object[] {"5","6","7","8" });
this.cob_DataBits.SelectedIndex = 3;
this.cob_StopBits.Items.AddRange(new object[] { "1","1.5","2" });
this.cob_StopBits.SelectedIndex = 0;
this.cob_ParityBit.Items.AddRange(new object[] { "无","奇校验","偶校验" });
this.cob_ParityBit.SelectedIndex = 0;
this.cob_SerialPort.Items.AddRange(ComPort.GetPortNmae);
this.cob_SerialPort.SelectedIndex = 0;
comPort = new ComPort();
IsSetProcessDocumentsClose = true;//开启接收串口数据的线程
SetProcessDocuments();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void cob_SerialPort_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox comboBox = (ComboBox)sender;
if (comboBox.Name == this.cob_SerialPort.Name)
{
}
if (comboBox.Name == this.cob_BaudRate.Name)
{
}
if (comboBox.Name == this.cob_DataBits.Name)
{
}
if (comboBox.Name == this.cob_ParityBit.Name)
{
}
}
private void btn_OpenPort_Click(object sender, EventArgs e) //打开串口
{
if (this.btn_OpenPort.Text == "打开串口")
{
var s = cob_SerialPort.Text; //串口号
var s1 = cob_BaudRate.Text; //波特率
var s2 = cob_DataBits.Text; //数据位
var s3 = cob_StopBits.Text; //停止位
var s4 = cob_ParityBit.Text; //校验位
StopBits bits = StopBits.Two;
switch (s3)
{
case "1":
bits = StopBits.One; break;
case "2":
bits = StopBits.Two; break;
case "1.5":
bits = StopBits.OnePointFive; break;
}
Parity parity = Parity.None;
switch (s4)
{
case "无":
parity = Parity.None; break;
case "奇校验":
parity = Parity.Odd; break;
case "偶校验":
parity = Parity.Even; break;
}
comPort.PortNmae = s;
comPort.BaudRate = Convert.ToInt32(s1);
comPort.DataBits = Convert.ToInt32(s2);
comPort.Parity = parity;
comPort.StopBits = bits;
comPort.OpenPort();
this.btn_OpenPort.Text = "关闭串口";
return;
}
if (this.btn_OpenPort.Text == "关闭串口")
{
comPort.ClosePort();
this.btn_OpenPort.Text = "打开串口";
return;
}
}
private async void btn_Send_Click(object sender, EventArgs e) //发送按钮
{
if (comPort.IsOpen)
{
DateTime date = DateTime.Now;
PanasonicPlcCommandBase panasonic = new CommandRCS(1,"y","0");
#region 同步模式
//var s = comPort.SendData(panasonic.CreationCommand(),PanasonicPlcComPort.Enum.CommandEnum.RCS);//读取单个触点状态信息
//set_AddDocumet(s.ReceiveData);
//panasonic = new CommandRCC(1,"y",0,1);
//var s1 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RCC);//读取已字为单位的触点数据
//set_AddDocumet(s1.ReceiveData);
//panasonic = new CommandRCP(1,"Y",5,new string[] {"0","1","2","3","4" });
//var s2 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RCP);//读取已字为单位的触点数据
//set_AddDocumet(s2.ReceiveData);
//panasonic = new CommandRD(1,"d",0,true);
//var s3 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RD);//读取数据寄存器数据
//set_AddDocumet(s3.ReceiveData);
//panasonic = new CommandRM(1,"P");
//var s4 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RM);//遥控PLC
//set_AddDocumet(s4.ReceiveData);
//panasonic = new CommandMultiRD(1,"d",0,10);
//var s5 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RD);//读取多个数据寄存器数据(有bug)
//set_AddDocumet(s5.ReceiveData);
//panasonic = new CommandMultiWD(1, "d",0,10,new int[] { 999,999,999,999,999},false);
//var s6 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WD);//写入多个数据寄存器数据
//set_AddDocumet(s6.ReceiveData);
//panasonic = new CommandSC(1,"Y",0,10,999);
//var s7 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.SC);//批量已字为单位写入触点
//set_AddDocumet(s7.ReceiveData);
//panasonic = new CommandSD(1, "d", 0, 1000, 999);
//var s8 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.SD);//批量已字为单位写入寄存器
//set_AddDocumet(s8.ReceiveData);
//panasonic = new CommandWCC(1,"y",0,true,555);
//var s8 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WCC);//写入字单位的触点的状态信息
//set_AddDocumet(s8.ReceiveData);
//panasonic = new CommandWCP(1, "y",2,new string[] { "0","1"},new bool[] { true,false});
//var s9 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WCP);//写入多个触点的状态信息
//set_AddDocumet(s9.ReceiveData);
//panasonic = new CommandWCS(1, "y", "0", false);
//this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
//this.richTextBox1.AppendText(panasonic.CreationCommand());
//var s10 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WCS);//写入单个触点的状态信息
//set_AddDocumet(s10.ReceiveData);
Thread.Sleep(100);
//panasonic = new CommandWD(1,"D",0,true,444);
//this.richTextBox1.AppendText("{"+"时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond+"}"+"发:->");
//this.richTextBox1.AppendText(panasonic.CreationCommand());
//var s11 = comPort.SendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WD);//写入数据寄存器值
//set_AddDocumet(s11.ReceiveData);
#endregion
#region 异步模式
date = DateTime.Now;
panasonic = new CommandWCS(1, "y", "0", true);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s10 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WCS);//写入单个触点的状态信息
set_AddDocumet(s10.ReceiveData);
//Thread.Sleep(100);
date = DateTime.Now;
panasonic = new CommandWD(1, "D", 0, true, 444);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s11 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WD);//写入数据寄存器值
set_AddDocumet(s11.ReceiveData);
date = DateTime.Now;
panasonic = new CommandRCS(1, "y", "0");
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RCS);//读取单个触点状态信息
set_AddDocumet(s.ReceiveData);
date = DateTime.Now;
panasonic = new CommandRCC(1, "y", 0, 1);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s1 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RCC);//读取已字为单位的触点数据
set_AddDocumet(s1.ReceiveData);
date = DateTime.Now;
panasonic = new CommandRCP(1, "Y", 5, new string[] { "0", "1", "2", "3", "4" });
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s2 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RCP);//读取已字为单位的触点数据
set_AddDocumet(s2.ReceiveData);
date = DateTime.Now;
panasonic = new CommandRD(1, "d", 0, true);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s3 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RD);//读取数据寄存器数据
set_AddDocumet(s3.ReceiveData);
date = DateTime.Now;
panasonic = new CommandMultiRD(1, "d", 0, 10);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s5 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RD);//读取多个数据寄存器数据(有bug)
set_AddDocumet(s5.ReceiveData);
date = DateTime.Now;
panasonic = new CommandMultiWD(1, "d", 0, 10, new int[] { 999, 999, 999, 999, 999 }, false);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s6 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WD);//写入多个数据寄存器数据
set_AddDocumet(s6.ReceiveData);
date = DateTime.Now;
panasonic = new CommandSC(1, "Y", 0, 10, 999);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s7 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.SC);//批量已字为单位写入触点
set_AddDocumet(s7.ReceiveData);
date = DateTime.Now;
panasonic = new CommandSD(1, "d", 0, 1000, 999);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s8 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.SD);//批量已字为单位写入寄存器
set_AddDocumet(s8.ReceiveData);
date = DateTime.Now;
panasonic = new CommandWCC(1, "y", 0, true, 555);
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s12 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WCC);//写入字单位的触点的状态信息
set_AddDocumet(s12.ReceiveData);
date = DateTime.Now;
panasonic = new CommandWCP(1, "y", 2, new string[] { "0", "1" }, new bool[] { true, false });
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s9 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.WCP);//写入多个触点的状态信息
set_AddDocumet(s9.ReceiveData);
date = DateTime.Now;
panasonic = new CommandRM(1, "P");
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s4 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RM);//遥控PLC
set_AddDocumet(s4.ReceiveData);
date = DateTime.Now;
panasonic = new CommandRM(1, "R");
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "发:->");
this.richTextBox1.AppendText(panasonic.CreationCommand());
var s13 = await comPort.AsyncSendData(panasonic.CreationCommand(), PanasonicPlcComPort.Enum.CommandEnum.RM);//遥控PLC
set_AddDocumet(s13.ReceiveData);
#endregion
}
}
private void btn_Clear_Click(object sender, EventArgs e) //清除按钮
{
this.richTextBox1.Clear();
}
#region 接收串口数据
private readonly object _SetsyncQueue = new object();
private readonly Queue<string> DocumentQueue = new Queue<string>();
/// <summary>
/// 往队列里添加元素
/// </summary>
/// <param name="str"></param>
private void set_AddDocumet(string str)
{
lock (_SetsyncQueue)
{
DocumentQueue.Enqueue(str);
}
}
/// <summary>
/// 从队列获取元素
/// </summary>
/// <returns></returns>
private string set_GetDocumet()
{
string str = null;
lock (_SetsyncQueue)
{
str = DocumentQueue.Dequeue();
}
return str;
}
/// <summary>
/// 检查队列是否还有元素
/// </summary>
private bool IsDocumentAvailable => DocumentQueue.Count > 0;
private bool IsSetProcessDocumentsClose = false;//表示是否退出接收队列消息的线程
/// <summary>
/// 发送消息线程
/// </summary>
private void SetProcessDocuments()
{
Task.Run(() =>
{
while (IsSetProcessDocumentsClose)
{
if (IsDocumentAvailable)
{
richTextBox1.Invoke(new Action(() =>
{
DateTime date = DateTime.Now;
this.richTextBox1.AppendText("{" + "时:" + date.Hour + "分:" + date.Minute + "秒:" + date.Second + "毫秒:" + date.Millisecond + "}" + "收:<-");
this.richTextBox1.AppendText(set_GetDocumet()+"\n");
this.richTextBox1.ScrollToCaret();
}));
}
//Thread.Sleep(10);
}
});
}
#endregion
}
}
C#松下PLC串口通讯Demo(MEWTOCOL-COM)通讯框架
于 2024-09-03 18:32:53 首次发布