說明:使用c#程式,通過串口操作plc,在此例子中,使用西門子的plc,程式是winform。
1.引用AxInterop.MSCommLib控件,操作串口,此控件需要註冊。
2.設置AxInterop.MSCommLib控件的參數:
commport:1 端口號 sttting:9600,e,7,2波特率等 inbuffersize:1024 緩存大小
3.由於直接採用和plc通信,中間沒有採用通信模塊,直接用rs232接口,因此需要循環讀取串口的數據。
如果使用一個通信模塊,那麼plc可以主動發送數據,並且可以直接用字符串進行通信。自定義通信規則,在plc
那邊進行解析,然後處理。
4.通信之前要打開串口:
isSerialPort = System.Configuration.ConfigurationSettings.AppSettings["isSerialPort"].ToString();
if (isSerialPort != "0") {
this.axMSCommTeco.PortOpen = true;
}
5.開啟一個線程,讀取plc中的數據。讀取plc的數據,其實,就是發一個命令,然後,一直讀取串口,等待plc數據返回此地址的數據。
private void GetData() {
while (true)
{
axMSCommTeco.Output = SendmessageReadplcNumber;
if (IsDataComplete())
{
updateText("1");
}
System.Threading.Thread.Sleep(iTimeout);
IsCountion = false;
if (IsStop) {
break;
}
}
}
6.給plc發送數據:
axMSCommTeco.Output = SendmessageReadplcNumber;
SendmessageReadplcNumber是要發送的字符串,發送之前要進行編碼。
7.寫plc地址:
public static string WriteAddrData(string Sadd, string Dadd, string Sdadd)
{
string strReturn = "@" + Sadd + "WD" + Dadd + Sdadd;
return strReturn + FCS(strReturn) + "*\r\n";
}
8.讀取plc地址的數據
public static string ReadAddrData(string Sadd, string Dadd, string Sdadd)
{
string strReturn = "@" + Sadd + "RD" + Dadd + Sdadd;
return strReturn + FCS(strReturn) + "*\r\n";
}
9.數據校驗
private static string FCS(String Value)
{
int i, f;
byte[] x;
f = 0;
for (i = 0; i < Value.Length; i++)
{
x = ASCIIEncoding.ASCII.GetBytes(Value.Substring(i, 1));
f = f ^ (int)x[0];
}
return f.ToString("X");
}
10.代碼使用寫串口數據
string message = TecoPlc.WriteAddrData("00", "0316", EfficiencySops.Target.ToString("X").PadLeft(4,'0'));//標準工時
axMSCommTeco.Output = message;
給地址316,寫入數據,數據 要求 4位,不夠位數補o。
11.讀取地址上的數據
message = TecoPlc.ReadAddrData("00", "0010", "0001");
System.Threading.Thread.Sleep(1000);
axMSCommTeco.Output = message;
先發送讀取命令,然後 循環讀取串口數據。
private string DataComplete()
{
string message = "";
while (true)
{
message += TypeUtil.toString(axMSCommTeco.Input);
if (message.Length > 2 && message.Substring(message.Length - 1, 1) == "\r")
{
break;
}
if (IsStop) {
break;
}
}
return message;
}
要注意,在發送命令后,要停止一段時間,如果連續發送 ,會達不到你要求的效果。我這裡設置每一條命令發送完成后,停止
System.Threading.Thread.Sleep(1000);
12.程式停止,不要關閉串口,除非關閉此窗口,才關閉串口。
德仔网尊重行业规范,每篇文章都注明有明确的作者和来源;德仔网的原创文章,请转载时务必注明文章作者和来源:德仔网;