Мое слейв-устройство поддерживает только две функции: 3-ю на чтение, 6-ую на запись. Как быть в данной ситуации?((((
Не совсем понимаю, почему, например в ПЛК Сименс, я не чередую запросы, а просто прописываю функцию, которой считываю, 3-ю, начальный адрес и количество регистров, и там нет никаких проблем.... В чем разница ? объясните мне, бестолковой?((((
С этим же устройством на тех же настройках? Обычно проблем подключить модуль через конфиурацию - 3 щелчка мыши.
Проблемы начинатся с нестандартными slave.
Тролль-наседка, добрый, нежный и ласковый
Библиотека одна, функции разные ))) пардон) если использую функцию библиотечную на чтение, то все работает, если в этот же проект добавляю функцию на запись, то начинается "сдвиг данных". так и в конфигураторе не работает даже считывание и запись по одному регистру(регистры,естественно разные, но одно устройство), там разные функции используются 3-я и 6-я.
вот "кусок" программы с функциями библиотечными:
(*Номер последнего запроса-вычисляется только при вхождении в границы действующего количества слэйвов*)
IF SlaveNumber<=KolSlave THEN
StopNumber[PN][SlaveNumber]:=StartNumber[PN][SlaveNumber];
ELSE
StartNumber[PN][SlaveNumber]:=0;
StopNumber[PN][SlaveNumber]:=0;
END_IF
(*Опрос устройства*)
IF Number[PN]>=StartNumber[PN][SlaveNumber] AND Number[PN]<=StopNumber[PN][SlaveNumber] THEN
IF FirstScan=0 THEN
FirstScan:= 1;
END_IF
SN:=Number[PN]-StartNumber[PN][SlaveNumber]+1;
(*Формирование послок*)
FOR i:=1 TO 1 DO
(*МADIO*)
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].DevAddr:=Address;
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].FirstAddr:=0;
MB_SLAVE_SETTING[PN][i+(StartNumber[PN][SlaveNumber]-1)].Quantity:=3;
END_FOR
(*МADIO*)
MB_RD_HOLD_REGS[PN](
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=MB_SLAVE_SETTING[PN][Number[PN]].DevAddr ,
FirstAddr:=MB_SLAVE_SETTING[PN][Number[PN]].FirstAddr ,
Quantity:=MB_SLAVE_SETTING[PN][Number[PN]].Quantity ,
ComHandle:=PN ,
TimeOut:=t#1000ms ,
Buffer:=Buffer[PN] ,
Complete=>MB_SLAVE_SETTING[PN][Number[PN]].Complete ,
Exception=>MB_SLAVE_SETTING[PN][Number[PN]].Exception ,
ByteCnt=>MB_SLAVE_SETTING[PN][Number[PN]].ByteCnt );
(*Перевод Byte в Word, переход на следующий Number[PN]*)
IF MB_SLAVE_SETTING[PN][Number[PN]].ByteCnt=MB_RD_HOLD_REGS[PN].Quantity*2 THEN
FOR i:=1 TO MB_SLAVE_SETTING[PN][Number[PN]].Quantity DO
ByteToWord(Byte01:=Buffer[PN][(i-1)*2+1] , Byte02:=Buffer[PN][(i-1)*2] , Word01=>Data_MADIO[i] );
END_FOR
END_IF
(***Преобразование в BOOL***)
FOR i:=1 TO 3 DO
WordToBool(
Word01:=Data_MADIO[i],
BoolArray=>Data_MADIO_BOOL_temp);
FOR j:=1 TO 16 DO
Data_MADIO_BOOL[j+(i-1)*16]:=Data_MADIO_BOOL_temp[j];
END_FOR
END_FOR
END_IF
(*запись*)
IF write_modbus_singl.Complete THEN
value[1]:=DataMADIOWrite[1];
END_IF
write_modbus_singl(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=100 ,
RegAddr:=5 ,
ComHandle:=2 ,
TimeOut:=t#100ms ,
Value:= value[1],
Complete=>COMPL ,
Exception=>EXCEP);
(*1 группа выходов*)
DataMADIOWrite[1].0:=0;
DataMADIOWrite[1].1:=0;
DataMADIOWrite[1].2:=0;
DataMADIOWrite[1].3:=0;
DataMADIOWrite[1].4:=0;
DataMADIOWrite[1].5:=0;
DataMADIOWrite[1].6:=0;
DataMADIOWrite[1].7:=0;
DataMADIOWrite[1].8:=MADIO_DO[1];
DataMADIOWrite[1].9:=MADIO_DO[2];
DataMADIOWrite[1].10:=MADIO_DO[3];
DataMADIOWrite[1].11:=MADIO_DO[4];
DataMADIOWrite[1].12:=MADIO_DO[5];
DataMADIOWrite[1].13:=MADIO_DO[6];
DataMADIOWrite[1].14:=MADIO_DO[7];
DataMADIOWrite[1].15:=MADIO_DO[8];
все порты используются, это в проекте с библиотеками, в данной части программы 2-й порт.
Я сейчас создала новый проект, без использования библиотек и других портов, чисто на считывание 1-го регистра и запись одного регистра (пятого). Записывает без проблем, считать не могу, происходит "сдвиг данных". что он там сдвигает, если я считываю один регистр? таймаут опроса 500 мс. я уже не понимаю как настраивать ПЛК 110((((
Очень странный мастер, если за время таймаута не пришел ответ, то нечего его больше ждать, переходим к следующему запросу хоть того же слейва хоть следующего.
я использовала функцию "case", но все равно не работало( понимая, что могу что-то не так написать в программе, создала именно пустой проект и пытаюсь считать с регистр №1 данные и записать данные в регистр №5 слейв-устройства с адресом 100 через конфигуратор ПЛК, уже без библиотек. Не получается: только чтение 1-го регистра или только запись одного регистра работают. Складывается такое ощущение, что в один слейв я не могу и считать и записать данные в режиме Master, или я что-то делаю не так(
Слейв устройство: модули ввода-вывода Мадио.