剩下的事,只有研究了,花了五千銀子,請了一個“專家”,對AB的產品非常熟。一星期后,終于有點眉目了,原來這個模塊就是一個典型的嵌入式系統,相當一個帶三個串口的386的電腦,操作系統為小型的DOS系統(TINY DOS),用C++為其開發程序。對DOS C我是非常熟的,可是如何與AB通信確不熟悉,幸好那個“專家”對此比較熟,我們二者一結合,果然成功了--效果出奇的好,不用AB PLC編一行代碼,就可以實現把數據寫入到變量區。下面是PLC的配置界面:


//基于 TINY DOS 的C++ 的核心通信程序
//*************************************************************************
//**函 數 名:Com_GetWHData
//**輸 入:intAddr - 紅外標尺地址
//** :intState - 標尺狀態 0~9 -1 表示校驗錯誤
//**輸 出:無
//**功能描述:獲取紅外標尺的信息
//**全局變量:
//**調用模塊:
//**作 者:葉帆
//**日 期:2004-11-24 16:56:57
//**修 改 人:
//**日 期:
//**版 本:V1.0.0
//*************************************************************************
void Com_GetWHData(WORD *intAddr,WORD *intState)
{
BYTE ch;
BYTE bytData[6];
BYTE bytFlag=0;
BYTE bytNum=0;
while(bytNum<7)
{
if (MVIsp_Getch(Commport,&ch,1000) != MVI_SUCCESS)
{
*intAddr=0;
*intState=9;
return;
}
if(bytFlag==1)
{
bytData[bytNum++]=ch;
}
if(ch==0xAC && bytNum==0)
{
bytFlag=1; //開始接收
}
}
//正副本校驗
if(bytData[0]==bytData[1] && bytData[2]==bytData[3] && bytData[4]==bytData[5])
{
//地址信息
*intAddr=(bytData[0]>>4)*(WORD)10000+(bytData[0] & 0x0f)*(WORD)1000+(bytData[2]>>4)*(WORD)100+(bytData[2] & 0x0f)*(WORD)10+(bytData[4]>>4);
//狀態信息
*intState=(bytData[4] & 0x0f);
}
else
{
*intAddr=0;
*intState=0xFF;
}
}
//*************************************************************************
//**函 數 名:ProcessCommand
//**輸 入:無
//**輸 出:無
//**功能描述:命令處理
//**全局變量:
//**調用模塊:
//**作 者:葉帆
//**日 期:2004-11-24 16:56:57
//**修 改 人:
//**日 期:
//**版 本:V1.0.0
//*************************************************************************
int ProcessCommand(void)
{
WORD intAddr;
WORD intState;
WORD intData[2];
//讀取紅外標尺信息
Com_GetWHData (&intAddr,&intState);
//MVIbp_SetUserLED(handle, MVI_LED_USER1, MVI_LED_STATE_OFF);
//讀取背板數據(注意,AB PLC在配置模塊時,輸出緩沖區的大小必須為0)
if (MVI_SUCCESS == MVIbp_ReadOutputImage(handle, intData, 0, 2))
{
//數據改變或有效才寫入數據
if (intState!=0xFF && (intData[0]!=intAddr ||intData[1]!=intState))
{
intData[0]=intAddr;
intData[1]=intState;
if (MVI_SUCCESS != MVIbp_WritebbbbbImage(handle,intData, 0, 2))
{
return(0); //原來為1,現改為0 2005年6月8日
}
//MVIbp_SetUserLED(handle, MVI_LED_USER1, MVI_LED_STATE_ON);
}
}
return(0);
}
------------------------------------------------------------
目前我敢說,只要還是基于這種模塊,只要知道協議,我就可以實現AB PLC與第三方模塊的通信。其實我也這樣做了,我用業余時間已經實現了 Modbus Rtu協議,實際測試后,效果不錯!










