PLC與計(jì)算機(jī)的串行接口相連接,現(xiàn)在需要在PLC與計(jì)算機(jī)相互發(fā)送字符“@“(ASCII碼為40),并進(jìn)行顯示。
數(shù)據(jù)長度: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,需要再測試
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編程,完全不懂指令如何組織,請各位大大們幫幫助。如何才能把值讀出來。