Страница 5 из 5 ПерваяПервая ... 345
Показано с 41 по 48 из 48

Тема: PLC110 modbus.lib MV110-8AC

  1. #41

    По умолчанию

    При наличии ошибки 255 вы их просто принудительно обнуляйте или присваивайте какие вам нужно значения

  2. #42
    Пользователь
    Регистрация
    16.08.2012
    Адрес
    Воронеж
    Сообщений
    146

    По умолчанию

    Это я понял, но почему 255 не постоянно, а переключается на 0 переодически.

  3. #43

    По умолчанию

    Не могу сказать, это лучше у разработчиков библиотеки уточнить

  4. #44
    Пользователь
    Регистрация
    16.08.2012
    Адрес
    Воронеж
    Сообщений
    146

    По умолчанию

    Добрый день. Вопрос ко всем кто использует библиотеку: Если физически отключить RS-485, err (ошибка modbus) постоянно переключается с 0 на 255, и complete (признак завершения операции) постоянно переключается False на True, как будто модуль продолжает опрашиваться - так должно быть или что-то не верно в примере?

  5. #45

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Подчистил для Воронежа, но не настаиваю на единственном способе
    Валенок очень понравился ваш вариант, изящно и красиво. Решил убрать у себя все эти "индии" и начал опробовать на модуле 2АС. В ФБ изменил:

    Код:
    FUNCTION_BLOCK (*строго ФБ ...*) MV2AC
    (*(C) Валенок*)
    VAR_OUTPUT
    	Ai : ARRAY[1..2] OF MV_2AC;
    END_VAR
    VAR
    		(*читаем 8 регистров за раз с адреса 16#106*)
    		SRD : ARRAY[1..2] OF WORD;
    		READ : ARRAY[1..2,1..3] OF WORD;
    		x : ARRAY[1..240] OF BYTE; (*просто добил буфер до 256 байт*)
    	(*!*)
    	i : INT;
    	p : POINTER TO ARRAY[1..2] OF WORD;
    END_VAR
    
    ---------------------------------------------------------------------------
    FOR i := 1 TO 2 DO
    	Ai[i].Status := SRD[i];
    	Ai[i].Cyclic := Read[i,3];
    	p := ADR(Ai[i].Value);
    	p^[1] := Read[i,2];
    	p^[2] := Read[i,1];
    END_FOR
    Структуру оставил как есть
    Код:
    TYPE MV_2AC :
    STRUCT
    	Status	 :ENUM_STATUS := STATUS_UNREADY;
     	Cyclic 	:WORD;
    	Value 	:REAL;
    END_STRUCT
    END_TYPE
    В программе соответственно:
    Код:
    CASE state OF
    		0:
    			enable:=1;
    			 (* функция 03 флоат - ФБ считывает значение параметров *)
    
    			PBuffer := ADR(MV2AC.SRD);
    			get3_modbus(
    				Enable:=enable,				(* разрешение работы блока *)
    				Mode:=MB_RTU ,				(* режим передачи*)
    				DevAddr:=40 ,					(* адрес*)
    				FirstAddr:= (*16#106*)262, 			(* номер регистра*)
    				Quantity:=8, 					(* количество регистров*)
    				ComHandle:=Settings.Port ,	(* номер COM-порта*)
    				TimeOut:=TimeOut , 			(* таймаут *)
    				Buffer:= PBuffer^ ,	(*Buffer,*)	(* буфер данных *)
    				Complete=>cmpl ,			(* скопировать признак завершения операции *)
    				Exception=>err ,				(* скопировать регистр ошибок *)
    				ByteCnt=>DataSize );			(*кол-во считанных байтов *)
    			(*если установлен признак завершения операции, то *)
    
    			IF cmpl THEN
    				IF err=0 THEN (*Если нет ошибок, то получаем  данные из буфера, формируем переменные*)
    					MV2AC;
    					IF MV2AC.Ai[1].Status <>0 THEN errAi1:=TRUE; ai1 := 0; ELSE errAi1:=FALSE; ai1 := MV2AC.Ai[1].Value; END_IF;
    					ai1w := REAL_TO_WORD (ai1);
    					IF MV2AC.Ai[2].Status <>0 THEN errAi2:=TRUE; ai2 := 0; ELSE errAi2:=TRUE; ai2 := MV2AC.Ai[2].Value; END_IF;
    					state:=1;
    					enable:=0;
    				ELSE
    				state:=1;
    				END_IF
    			END_IF
    
    		1:
    			state:=0;
    	END_CASE
    Но значения получаю неправильные (что-то там в -30 или т.п. степени). Через "индию" всё норм, но некрасиво .

    Что-то подсказывает мне, что в ФБ что-то неправильно, но что не пойму, карта регистров 2ас и 8ас вроде как совпадает (только количеством каналов отличается) .

    Не подскажете что не так?
    Последний раз редактировалось energvk; 29.09.2016 в 11:09.

  6. #46

    По умолчанию

    Спасибо, так заработало. Только бы въехать в назначение функции...(((

    Как я понял функция - аналог кода в 37 посте:
    var
    pw : pointer to array[1..32] of word;
    ......
    pw := adr(MV8AC.SRD);
    for i := 1 to 32 do //получение исходной структуры из сетевого набора байт
    pw^[i] := rol(pw^[i],8);
    end_if

    Что мне непонятно это присвоение pw, да и PBuffer ADR(MV8AC.SRD). Почему не ADR(MV8AC)?

    И по идее нормально будет работать на 2А, 8А модулях

    В таком виде мне понятно, что происходит, не уверен, что код корректный, но данные обрабатывает правильно:
    Код:
    					SysMemCpy(ADR(MV2AC),ADR(Buffer),16);
    					pw := ADR(MV2AC);
    					FOR j := 1 TO 8 DO (*получение исходной структуры из сетевого набора байт*)
    					pw^[j] := ROL(pw^[j],8);
    					END_FOR;
    					MV2AC; 	(*Исходные => конечные *)
    Последний раз редактировалось energvk; 29.09.2016 в 16:32. Причина: добавлено

  7. #47

    По умолчанию

    В примере данные заносятся с адреса mv2ac.SRD, а то что SRD в расположена самой первой в структуре mva2c момент условно случайный. Сделай :
    var
    i : int;
    SRD....
    ...
    и все поймешь..
    Понял.

    Вообще, спасибо большое за подробные объяснения. Понял, что как и почему.

    ЗЫ
    Код:
    function get_original_from_net : bool
    //Сетевые -> в исходные (для modbus.lib)
    var_input
    	pdata : pointer to word;
    	size : byte; (*в байтах*)
    end_var
    ------------
    get_original_from_net := (pdata <> 0) and ((pdata mod 1) = 0); //не nil и четный
    
    if get_original_from_net then
    	szdata := szdata / 2; //в регистрах-словах
    ...
    end_if
    Я так понимаю, что должно быть:
    Код:
    var_input
    	pdata : pointer to word;
    	size : byte; (*в байтах*)
    end_var
    var
    	szdata : byte; (*в байтах*)
    end_var
    ------------
    get_original_from_net := (pdata <> 0) and ((pdata mod 1) = 0); //не nil и четный
    
    if get_original_from_net then
    	szdata := size / 2; //в регистрах-словах
    ...
    end_if
    ЗЗЫ. И ещё: Вы не рекомендуете
    И я бы принципиально не стал делать в одном проходе из сетевого набора байт конечную структуру
    . При этом ваша функция это делает за раз. Или я что-то неправильно понимаю?

  8. #48

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    )) Да. Очепятался. Просто size на входе, size := size / 2, и далее везде size, дополнительно водить переменную здесь особо и не нужно


    В смысле за раз ? И сетевого в исходный - да, за раз. Когда исходная=конечная этого достаточно (например считать все счетчики МДВВ). Но тут еще и исходная=>конечная нужно сделать, что дальше MV2/8A() и делает.

    И, кстати, делать раздельные структуры единичного ai для 2AC и 8AC - не нужно. Описание статуса одинаково для 2A,8A,2AC,8AC,MVA8,PLC63/73/150/154/160 (конечно, афтару INCORRECT для 160-ого развальцевать кое-чего не помешало бы). Да и структура входа 2/8AC легко приводится (в целях унификации) к виду соответствующему 2/8A/MVA8. Или наоборот.
    Огромное спасибо)))

Страница 5 из 5 ПерваяПервая ... 345

Похожие темы

  1. 2 PLC110 + CoDesys OPC + MasterSCADA
    от Никита Заиграев в разделе Master SCADA 3
    Ответов: 4
    Последнее сообщение: 22.10.2015, 16:30
  2. А реально такое реализовать!!! PLC110 + ModBus Slave №.......
    от polik в разделе Помощь Разработчикам
    Ответов: 7
    Последнее сообщение: 30.07.2015, 21:37
  3. SysLibFile.lib & PLC110-30m
    от Smith2007 в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 15.10.2013, 21:50
  4. о параметрах Ai в мва8 и Mv110
    от Владимир С. в разделе Эксплуатация
    Ответов: 0
    Последнее сообщение: 15.09.2009, 21:44

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •