winform 如何监听三菱fx plc的x1 - x7的状态
上面的代码是,使用定时器的,我想在初始化的时候,连接发送指令,当X1 - X7状态改变时,就能获取到它们的值
winform 如何监听三菱fx plc的x1 - x7的状态
下午好🌅🌅🌅
本答案参考ChatGPT-3.5
问题:winform如何监听三菱FX PLC的X1 - X7的状态?
解决方案:
修改后的代码:
//窗体初始化
private void Form1_Load(object sender, EventArgs e)
{
//连接三菱PLC
string portName1 = "COM1";
int baudRatel = 38400;
SerialPort _serialPort = new SerialPort(portName1, baudRatel, Parity.None, 8, StopBits.One);
_serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived_1);
_serialPort.Open();
//定时器
Timer timer1 = new System.Windows.Forms.Timer();
timer1.Interval = 2000; //设置定时器间隔为1秒
timer1.Tick += new EventHandler(timer1_Tick); //添加定时器事件处理程序
timer1.Enabled = true; //启用定时器
}
//定时器事件处理程序
private void timer1_Tick(object sender, EventArgs e)
{
//每一秒发送一次指令,获取到X1-X7的值
byte[] readBuffer = { 0x02, 0x30, 0x30, 0x30, 0x38, 0x30, 0x30, 0x31, 0x03, 0x35, 0x43 }; //读取X1-X7的值
_serialPort.Write(readBuffer, 0, readBuffer.Length);
}
//接收返回参数
private void SerialPort_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
{
try
{
this.BeginInvoke((MethodInvoker)delegate
{
byte[] buffer = new byte[_serialPort.BytesToRead];
_serialPort.Read(buffer, 0, buffer.Length);
//将接收到的数据转换为十六进制字符串
string receivedDataHex = BitConverter.ToString(buffer).Replace("-", "");
//将十六进制字符串转换为字节数组
string[] hexValues = receivedDataHex.Split(' ');
List<byte> byteValues = new List<byte>();
bool shouldConvert = false; //标记是否需要转换当前十六进制数为二进制数
foreach (string hex in hexValues)
{
if (hex == "82")
{
shouldConvert = true;
}
else if (hex == "03")
{
shouldConvert = false;
}
else if (shouldConvert && hex != "30" && hex != "B1" && hex != "B2")
{
byteValues.Add(Convert.ToByte(hex, 16));
}
}
//将字节数组转换为ASCII码
string asciiString = Encoding.ASCII.GetString(byteValues.ToArray());
//将ASCII码转换为二进制字符串
StringBuilder binaryData = new StringBuilder();
foreach (char c in asciiString)
{
string binaryValue = Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0');
binaryData.Append(binaryValue);
}
string binaryString = binaryData.ToString();
//根据二进制字符串中X1-X7的值判断状态是否有变化
if (binaryString.Length > 4)
{
int x2 = binaryString[1] - '0';
int x3 = binaryString[0] - '0';
if (x2 == 1)
{
Console.WriteLine("检测产品到X02");
}
else if (x3 == 1)
{
Console.WriteLine("检测产品到X03");
}
}
});
}
catch (Exception ex)
{
MessageBox.Show("接收返回异常:" + ex.Message);
}
}