PLC與PC串列埠通訊
前幾天要做一個跟PLC通訊的程式,在這裡講一講學到的一點東西
程式如果是用VB來做的話有一個MScomm控制元件,比較簡單,不過我只在VB6.0裡面發現有這個控制元件.在.net裡面沒有,好像要通過某些操作可以加進來,我覺得比較麻煩就沒有去做.
我是用C++來做的,平臺是.net2005.沒有用控制元件,直接用到幾個串列埠連線及操作的API函式.
首先是跟串列埠的連線,一般是用com1口
code:
///////
m_hCom=CreateFile(L"COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, 0,NULL);
///////
//m_hCom是一個HANDLE,判斷它是否為空,空表示開啟串列埠失敗,那要檢查一下串列埠是否可以用了.
SetupComm(m_hCom,READBUFLEN,WRITEBUFLEN); // 初始化通訊裝置引數
///READBUFLEN是自己定義的讀緩衝的長度,WRITEBUFLEN是寫緩衝的長度
COMMTIMEOUTS CommTimeOuts;CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; //接收兩連續位元組的最大時間間隔
CommTimeOuts.ReadTotalTimeoutMultiplier =0; //接收每位元組的平均允許時間
CommTimeOuts.ReadTotalTimeoutConstant = 0 ; //接收時間常數
CommTimeOuts.WriteTotalTimeoutMultiplier =100; //接收每位元組的平均允許時間
CommTimeOuts.WriteTotalTimeoutConstant = 500 ; //接收時間常數
SetCommTimeouts (m_hCom , &CommTimeOuts) ;
//上面是設定非同步操作的時間間隔
//獲取並設定串列埠
DCB dcb;
GetCommState(m_hCom, &dcb) ;
dcb.BaudRate = 9600;//位元率
dcb.ByteSize = 7;//位元組數
dcb.Parity = EVENPARITY;//偶校驗
dcb.StopBits = TWOSTOPBITS ; //2位停止位
SetCommState( m_hCom, &dcb);
PurgeComm (m_hCom,PURGE_TXCLEAR | PURGE_RXCLEAR) ; // 清除緩衝資訊
.....
DWORD lbyteswritten;
WriteFile(m_hCom,SendString,WRITEBUFLEN,&lbyteswritten,0);
/*WriteFile是向PLC傳送訊號,SendString是訊號碼,是一個字串,一般是用ASCII碼,不過不是標準的ASCII碼,是 PLC生產公司自己定義的,如果他們公司沒有定義的ASCII碼的話就用標準的,比如Omron定義的ASCII碼裡面沒有回車符的定義,所以用標準的 '/x0D'表示.*/
.......
DWORD lbytesreaded;
char Data[READBUFLEN];
memset(Data,'/0',READBUFLEN);
ReadFile(m_hCom,Data,READBUFLEN,&lbytesreaded,0);
/*ReadFile是接收從PLC上發回來的訊號,這個訊號要能正確反應真實訊號的話需要傳送的訊號格式正確才行.Data是一個字串,你可以對裡面的某一位的值進行判斷以確定接收到什麼變化.然後進行相應的處理.
最後不要忘記在關閉程式的時候*/
.....
CloseHandle(m_hCom);//將開啟的串列埠控制代碼關閉
/*事實上與PLC的通訊最終歸結為串列埠通訊,只要知道PLC傳送和接收的格式就可以很容易完成。
至於PLC內部的程式控制就要懂工控的強人來寫程式了。一般來說都是兩方面的人員商量好一個都可以接受的協議然後大家按照協議來寫各自的程式,最後通訊的時候只需要對協議處理就行。*/