zhang5wen
級(jí)別: *
|
PLC與計(jì)算機(jī)的串行接口相連接,現(xiàn)在需要在PLC與計(jì)算機(jī)相互發(fā)送字符“@“(ASCII碼為40),并進(jìn)行顯示。 數(shù)據(jù)長(zhǎng)度:8位ASCII碼; 奇偶校驗(yàn):偶校; 波特率:9600BIT/S; 數(shù)據(jù)傳送時(shí),首先通過計(jì)算機(jī)程序發(fā)送字符”@“,PLC接收從計(jì)算機(jī)偶發(fā)送的字符到數(shù)據(jù)寄存器D0、D1中,然后PLC發(fā)送D10、D11的字符到計(jì)算機(jī),并且進(jìn)行顯示。 PLC字符發(fā)送的數(shù)據(jù)存儲(chǔ)器:選 擇數(shù)據(jù)存儲(chǔ)器的地址為D10、D11. PLC字符接數(shù)據(jù)存儲(chǔ)器為D0、D1. 計(jì)算機(jī)程序C#代碼: private string ReadPlc() { string TxtValue = ""; com = new SerialPort("COM1", 9600, Parity.Even, 8, StopBits.Two); if (com.IsOpen) com.Close(); com.Open(); string sReadCmd = Chr(40) + "0119404" + Chr(3) + "66"; //主要是這個(gè)指令不懂如何組織? com.Write(sReadCmd); //等待1秒鐘 System.Threading.Thread.Sleep(1000); // 從串口讀數(shù)據(jù) byte[] data = new byte[1024]; com.Read(data, 0, 1024); //如果首位為2,則表示數(shù)據(jù)有效.這里有個(gè)問題,在第二次讀,第2位才為'2',第三次又是首位為2,需要再測(cè)試 if (data[0] == 2) { string sReceiveData = System.Text.Encoding.ASCII.GetString(data, 0, data.Length); //MessageBox.Show(sReceiveData); //解析命令,將讀到的字符解析成數(shù)字,注意高低位的轉(zhuǎn)換 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); TxtValue += res.ToString() + ","; } } return TxtValue; } 小弟是第一次接觸PLC編程,完全不懂指令如何組織,請(qǐng)各位大大們幫幫助。如何才能把值讀出來。 |
---|---|
|