Показано с 1 по 9 из 9

Тема: Как циклически опрашивать регистры?

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Предназначение системы. ПЛК опрашивает 20 модулей МК110 (разного типа). В принципе их количество может варьироваться, главное быстро изменить код программы. Поэтому выбран для хранения массив, т.е. ПЛК держит всю информацию в массиве, где строчка содержит информацию об одном МК110 и производит операции управления вне зависимости от команд ModBus (Master). Другими словами ПЛК осуществляет местное управление, а ModBus (Master) удаленное. Конечно существует вопрос приоритета команд, но это здесь не требуется. Т.е. Сигнал управления (запись регистра выхода) на МК110 может прийти от:
    1) самого ПЛК
    2)с внешнего устройства ModBus (Master)
    Вот для осуществления последнего варианта (управление и передачи состояния) как раз и хотелось бы из цикла обратиться и записать значение регистра ModBus (slave). Например

    VAR_GLOBAL
    In_0 AT%QW9.1.0:WORD;
    In_1 AT%QW9.2.0:WORD;
    In_2 AT%QW9.3.0:WORD;

    In_19 AT%QW9.19.0:WORD;
    END_VAR

    FUNCTION Byte2_to_Word : WORD; (*объединяет два байта в WORD *)
    программа:
    FOR i:=0 TO 19 DO (*массив c 20 строчками, содержащий регистры МК110*)
    Massiv[i, 0]:=…; (*запись в массив прочитанного регистра входа МК110*)
    Massiv[i, 1]:=…; (*запись в массив прочитанного регистра выхода МК110*)

    CASE i OF
    0: In_0:= Byte2_to_Word (Massiv[0, 0], (Massiv[0, 1]); (*Regist_MK110_N1*)
    1: In_1:= Byte2_to_Word (Massiv[1, 0], (Massiv[1, 1]); (*Regist_MK110_N2*)
    2: In_2:= Byte2_to_Word (Massiv[2, 0], (Massiv[2, 1]); (*Regist_MK110_N3*)

    19: In_19:= Byte2_to_Word (Massiv[19, 0], (Massiv[19, 1]); (*Regist_MK110_N20*)
    END_CASE
    END_FOR

    Вот хотелось бы без Case обойтись. Предполагается, что объявленные переменные ModBus (slave) будут располагаться в памяти контроллера последовательно и без пропусков. Надо попробовать указатели ADR() применить, но я в них не силен. Пока думаю в цикле надо вместо Case:
    p:= ADR(In_0)+I; (*i-индекс массива, [Byte]*)
    p1:=p+1; (*адрес следующего байта *)
    А как, зная адрес, записать значение по этому адресу? Я прав:
    p^:= Massiv[I, 0]; (*первый байт WORD*)
    p1^:= Massiv[I, 1]; (*втрой байтWORD*)
    Почему «попахивает индусским кодом?». Можете предложить более рациональную логику программы?
    Последний раз редактировалось Радонежский; 05.09.2014 в 09:40.

Похожие темы

  1. регистры.... регистры...
    от vvu2011 в разделе Панели оператора (HMI)
    Ответов: 1
    Последнее сообщение: 30.10.2010, 09:49
  2. регистры
    от кубанец в разделе Панели оператора (HMI)
    Ответов: 1
    Последнее сообщение: 13.05.2010, 14:17
  3. как распределены регистры ип320 присвязи с плк110
    от Alexey0027 в разделе Панели оператора (HMI)
    Ответов: 9
    Последнее сообщение: 02.05.2010, 22:26

Ваши права

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