Вот тут я уже ниасилил....
IF pDisp^.AdressForPooling = Base.Adress THEN
PoolingStat.SecondPoint();
IF GetData THEN AnswerStat.FirstPoint(); END_IF;
pDisp^.GetHoldRegs(
Enable:= GetData,
Mode:= MB_RTU,
DevAddr:= Base.Adress,
FirstAddr:= DataRegister,
Quantity:= RegisterCount,
ComHandle:= pDisp^.Settings.Port,
TimeOut:= TimeOut,
Buffer:= pDisp^.ReciveBuffer);
Указатели в VAR_INPUT можно заменить на внутренние переменные FB в разделе VAR_IN_OUT (это те же указатели в более удобоваримой для этих функций форме, не создают области памяти для себя и не происходит копирования переменных при вызове экземпляра. Поправьте меня, если ошибаюсь)
В принципе без детального изучения... разобрался. Вижу основную проблему быстродействия в CASE. Очередность вызовов диспетчером: диспетчер должен (имхо) не только устанавливать флаг, если время поллинга наступило, но и сразу же осуществлять вызов экземляров фб для записи чтения - для этого модули желательно унифицировать в массив из одноипных FB с массивами регистров внутрях. А массивы уже можно привязать к суказателям на структуры самих модулей в дальнейшем. Я пошел по такому пути.




Ответить с цитированием