Кирилл, спасибо за то что поделились трудами - это как бальзам на душу!
А модули аналогового вывода вы не используете в своих задачах?
Кирилл, спасибо за то что поделились трудами - это как бальзам на душу!
А модули аналогового вывода вы не используете в своих задачах?
Модуль простой, 6 последовательных регистров со значениями интовыми и столько же "безопасных" значений, которые ставятся, если превышен сетевой таймаут, только их каждый цикл обновлять нельзя, там память имеет ресурс.
Прочитал вашу документацию и залип только в одном месте - правильно сформировать буфер на отправку значений.
Неужели будет просто:
FOR i:=1 TO 6 DO
pData := ADR(Mdl.AO[i]); (*mdl с новым типом для этого модуля, у которого есть массив из 6 интов под аналоговый выход АО*)
Mdl.pDisp^.SendBuffer[i-1] := pData^;
END_FOR;
?
Такие вещи, как безопасные значения, обычно конфигурируются отдельно.
Но если Вы хотите в своем коде это сделать, то лучше на первом скане записать безопасные значения, а далее работать только с текущими.
Еще нужно добавить:
pData := pData + 1;
Mdl.pDisp^.SendBuffer[i] := pData^;
Иначе получается, что Вы только первый байт от INT кладете в буфер.
Так и запланировал сразу.
Тогда с правильными индексами:
FOR i:=1 TO 6 DO
pData := ADR(Mdl.ao[i]);
Mdl.pDisp^.SendBuffer[(i-1)*2] := pData^;
pData := pData + 1;
Mdl.pDisp^.SendBuffer[(i-1)*2+1] := pData^;
END_FOR;
Проверю на неделе как работает и буду дописывать для 16р и для 220.3м (у которого вагон и маленькая тележка измеряемых параметров), потом могу выложить сюда, если интересно
Может сразу подскажете longи и floatы справа налево будут писаться? 4-й байт первым и 1-й байт последним в буфер?