Извините за назойливость и не подумайте, что я пытаюсь учить разработчика - просто пытаюсь понять, правильно ли работаю.
Перенес часть кода в глобальный макрос, чтобы вызывать из других макросов. Читаю информацию из области регистров с "разрывами", поэтому два чтения
Код:
void Read_AC_DR(WORD AddrDev, WORD AddrBufPSW)
{
WORD value;
WORD arrvalue[4];
BOOL rez;
// Info from AC Drive
rez = Reads(PLC, AddrDev, MODBUS_RTU_REGS_4X, 41473, 5, &arrvalue);
if(rez)
{
PSW[AddrBufPSW] = arrvalue[0];
PSW[AddrBufPSW + 1] = arrvalue[3];
PSW[AddrBufPSW + 2] = arrvalue[4];
}
rez = Read(PLC, AddrDev, MODBUS_RTU_REG_4X, 41496, 0, TYPE_WORD, &value);
if(rez)
{
PSW[AddrBufPSW + 3] = value;
}
}
Вопросs
1) Надо ли перестраховываться с контролем результата обмена в Reads? У меня проект работает в реальной панели, ведомых устройств физически нет, и сложилось впечатление, ч то в регистры попадает какой-то мусор. Ну тоесть, если чтение прошло с ошибкой, или стработал тайм-аут (у меня он срабатывает), то в arrvalue ничего не записывается? Режим исполнения макроса, где вызывается данная подпрограмма - циклический, 1 секунда, "параллельно".
2) Правильно ли использование value? Так дается в примерах по всему руководству, но, опять же не пытаясь учить, и понимая, что у вас Си-подобный синтаксис языка, пытаюсь снять свои сомнения. Ну мало ли, опечатка какая вкралась... Люди же используют в тысячах проектов, а я тут умный такой выискался
.
WORD arrvalue[5];
если бы я пытался взять адрес первого элемента этого массива в Си - я использовал бы не &arrvalue, а просто arrvalue без амперсенда. У Вас адрес берется не так, как в Си?
Не воспримите как упрек, я понимаю, что могу ошибаться, и что у Вас свой собственный язык, ну просто когда на разных языках, подобных, пишешь, надо избежать ошибок (это я про себя
).
PS Возможно, "мусор" в arrvalue - это результат использования локального массива без инициализации, и даже скорее всего именно из-за этого. Как я понял, глобальные переменные в глобальном макросе инициализируются нулем, если нет явной их инициализации, а локальные никак не инициализируются по умолчанию?