此程序是在visual studio 2005的MFC程序中执行的,通过引入ModbusRTU.dll进行程序的编程,通过Dependency Walker工具查看ModbusRTU.dll中的静态函数如下:
在ModbusRTU.h文件中
MOD_API WORD RTUReadDiscreteInputs(BYTE nSlaveAddress, WORD nUnitAddress, WORD nUnitCount, BYTE* pReturnBuf);
在xxx.cpp文件中
WORD xxx::ReadModbusCoil(int iSlave,int iAdd,int iCount)
{
BYTE pBuf[256];
WORD retWord =RTUReadDiscreteInputs(iSlave, (WORD)0, iCount, pBuf);
WORD wVal;
if(retWord == MODBUS_SUCCESS)
{
wVal = MAKEWORD(pBuf[0],pBuf[1]);
return wVal;
}
return -1;
}
最后在页面上执行
void DlgPolePipeSet::OnBnClickedButton5()
{
EDM* pEdm;
WORD wR ;
WORD wR03;
CString str;
CString str2;
pEdm =EDM::GetEdmInstance();
wR = pEdm->ReadModbusCoil(1,0,16);
str.Format("0x%X",wR);
GetDlgItem(IDC_EDIT45)->SetWindowText(str);
wR03 = pEdm->ReadModbusCoil(6,0,16);//读一个空位
wR03 = pEdm->ReadModbusCoil(5,0,16);
str.Format("0x%X",wR03);
GetDlgItem(IDC_EDIT46)->SetWindowText(str);
}
读取物理位置为01或者05的Modbus的数据,得出的值总是错误的。