Я совершенно новичок в протоколе Modbus. Моя установка состоит из трех устройств с разными адресами. Все они подключены к COM1 через RS232. Я использовал Modbus Poll для проверки входных данных, который работает правильно. Что я хочу сделать сейчас, так это прочитать регистры хранения в приложении vc++ (MFC). Для последовательной связи я использую класс MSComm. Я написал небольшой код, но я вообще не получаю ввода.
Мой код на данный момент:
BOOL Crs232test4Dlg::OpenConnection ()
{
char error [513];
try
{
if (! m_MSComm.GetPortOpen ())
{
m_MSComm.SetCommPort (1);
m_MSComm.SetSettings ("9600,N,8,1");
m_MSComm.SetInputLen (4);
// Receive Data as Text
m_MSComm.SetInputMode (0);
m_MSComm.SetPortOpen (true);
m_MSComm.SetCommID (1);
return m_MSComm.GetPortOpen ();
}
AfxMessageBox ("Success!!!!", MB_OK);
return TRUE;
}
catch (CException *e)
{
e->GetErrorMessage (error, 512);
AfxMessageBox (error, MB_OK);
return FALSE;
}
}
void Crs232test4Dlg::OnVaisalaComm ()
{
if (m_MSComm.GetCommEvent () == 2)
{
COleVariant in_dat;
in_dat = m_MSComm.GetInput ();
Sleep (100);
CString strInput (in_dat.bstrVal);
m_Input = m_Input + strInput;
UpdateData (FALSE);
}
}
Я хочу выложить m_Input сейчас, но он ничуть не изменился. Я также получаю предупреждение (свойство доступно только для чтения) при установке SetCommID, что я не думаю, что это важно.
Может кто-нибудь, пожалуйста, направьте меня, так как я действительно невежественен в данный момент.
С уважением
РЕДАКТИРОВАТЬ: Согласно примеру связи, я пытался обращаться с устройством как с файлом.
m_hCom = CreateFile(m_sComPort,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security
OPEN_EXISTING,
0, // no overlapped I/O
NULL); // null template
// :(colon) Address=1 Function=3 Starting register= 40001 (To write 400001 or 0?)
Registers to read=4 checksum CR LF
char strASCII[] = "3A 30 31 30 33 30 30 30 30 30 30 30 34 46 38 0D 0A";
bWriteRC = WriteFile (m_hCom, strASCII, strlen(strASCII), &iBytesWritten, NULL);
memset(sBuffer,0,sizeof(sBuffer));
// Reading output of the M3
bReadRC = ReadFile (m_hCom, &sBuffer, 1, &iBytesRead, NULL);
if (bReadRC && iBytesRead > 0)
{
sResult = sBuffer;
}
else
{
sResult = "Read Failed";
dwError = GetLastError();
sprintf(sMsg, "Read length failed: RC=%d Bytes read=%d, "
"Error=%d ",
bReadRC, iBytesRead, dwError);
AfxMessageBox(sMsg);
}
Я получаю ошибку длины чтения. strASCII обычно не разделяется, только для лучшего обзора. Я проверил связь в Modbus Poll. Мой вывод правильный, но, похоже, он не получает данные.
РЕДАКТИРОВАТЬ: я понял. Большое спасибо за Вашу помощь. Я ввел неправильную контрольную сумму.