Страница 884 из 1044 ПерваяПервая ... 384784834874882883884885886894934984 ... ПоследняяПоследняя
Показано с 8,831 по 8,840 из 10432

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #8831

    По умолчанию

    Добрый день. А как-то можно разделить переменные для записи и чтения в Modbus Slave ПЛК110? По умолчанию все переменные идут по очереди с нулевого регистра. И допустим, у меня первые 10 переменных для записи Панелью (она мастер), а дальше 10 переменных для считывания панелью. Если мне нужно добавить еще одну переменную записи, то регистры считывания смещаются, что неудобно. Есть какой-то способ разделить их?

  2. #8832

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    кто же Вам мешает наделать пустышек между регистрами записи и чтения?
    Спасибо за ответ! Да, это выход.

  3. #8833
    Пользователь
    Регистрация
    27.10.2014
    Адрес
    Заречный Свердловской обл.
    Сообщений
    3

    По умолчанию

    Имею вопрос. Может это и было, не увидел.. Есть энкодер инкрементальный, с него я в счетчик CTUD отправляю. Мне счетчик на 4 байта нужен, а CTUD на два, т.е. последовательно два счетчика. Вопрос в том как объединить старший и младший WORDы счетчика на выходе и уставке перед счетчиками в DWORDы на выходе и уставке. Получать-отправлять по Modbus, так эти переменные я задал в DWORD. Может счетчик сделать 4-х быйтным? Или переменные для Modbus разбить на WORD ? Может это это элементарно, подскажите.

  4. #8834

    По умолчанию

    Цитата Сообщение от Serg S Посмотреть сообщение
    Имею вопрос. Может это и было, не увидел.. Есть энкодер инкрементальный, с него я в счетчик CTUD отправляю. Мне счетчик на 4 байта нужен, а CTUD на два, т.е. последовательно два счетчика. Вопрос в том как объединить старший и младший WORDы счетчика на выходе и уставке перед счетчиками в DWORDы на выходе и уставке. Получать-отправлять по Modbus, так эти переменные я задал в DWORD. Может счетчик сделать 4-х быйтным? Или переменные для Modbus разбить на WORD ? Может это это элементарно, подскажите.
    Можно написать свой счётчик, с выходом DWORD, будет 4 байтное число) Вот пример функционального блока CTU_My 1 Мой счётчик.jpg
    Например так ( это часть кода), вторую допишите сами
    Скрытый текст:

    FUNCTION_BLOCK CTU_My
    VAR_INPUT
    C: BOOL;
    Res : BOOL;
    PV: DWORD;
    END_VAR
    VAR_OUTPUT
    Q: BOOL;
    CV: DWORD;
    END_VAR
    VAR
    R_TRIG1: R_TRIG;
    S1: BOOL;
    END_VAR
    __________________________________________________ _____
    R_TRIG1(CLK:=C , Q=>S1 );
    IF S1 AND CV<PV THEN
    CV:=CV+1;
    END_IF
    Q:=(CV=PV);
    Последний раз редактировалось kondor3000; 29.05.2022 в 23:24.

  5. #8835
    Пользователь
    Регистрация
    27.10.2014
    Адрес
    Заречный Свердловской обл.
    Сообщений
    3

    По умолчанию

    Спасибо, попробую в этом направлении.

  6. #8836

    По умолчанию

    Добрый вечер, в прошлый раз обращалась по поводу связи с датчиком по rs232, все оказалось гораздо проще, чем я думала (для считывания данных сделала по шаблону). Но есть еще проблемы.
    1) Датчик непрерывно, после каждого измерения, отсылает данные (23 байта, первые два байта "38" и "65" - начало нового измерения, третий - знак), я сначала создала массив размером 315 байт, затем уменьшила и снова увеличила, в итоге при подключении к контроллеру в массиве либо сохранялись значения элементов наименьшего массива, либо все были равны 0, только при изменении адреса буфера (в SysComRead) значения записывались, но записывалось одно измерение (только 23 байта), хотя в SysComRead я задавала прочесть например 100 байтов.
    2) После чтения данных, хотела их обработать, написала код (в программировании я вообще не сильна и на st в кодесисе тяжело писать), но контроллер ругается, и я не знаю, можно ли работать с буффером когда порт еще открыт, и я не очень поняла на st весь код работает циклично ?
    обработка простая: каждый байт в массиве это отдельная цифра, чтобы получить значение числа каждый байт домножаю на 10^n и суммирую, это значение я записываю в глобальную переменную, чтобы работать с ним в основной программе
    Код программы:

    (*Открываем порт RS-232*)

    IF COM_SERVICE1.ready=FALSE THEN
    (* 1 - RS-232 *)
    com_num:=1;
    (*
    Настройки порта (com_settings):
    byParity - Режим проверки четности 0 = нет, 1 = нечет, 2 = чет
    byStopBits - Кол-во стоповых бит 0 =один, 1=полтора , 2=два
    dwBaudRate - Скорость обмена 4800, 9600, 19200, 38400, 57600, 115200 бит/с.
    dwBufferSize - Не используется должно быть =0
    dwScan - Не используется должно быть =0
    dwTimeout - Не используется должно быть =0
    Port - Номер порта в формате перечисления PORTS (com_number)
    *)
    Settings.Port:=com_num;
    Settings.dwBaudRate:=9600;
    Settings.byParity:=0;
    Settings.dwTimeout:=0;
    Settings.byStopBits:=0;
    Settings.dwBufferSize:=0;
    Settings.dwScan:=0;
    (*
    Настройка и открытие порта (COM_SERVICE)
    Пока на выходе Ready не будет сигнал TRUE, стучимся в порт
    Порт открывается с настройками, указанными в com_settings,
    а на вход Task подаются следующие значения:

    0 - Открытие и настройка порта в соответствии с настройками в структуре Settings
    1 - Изменение настроек уже открытого порта на настройки указанные в Settings
    2 - Закрытие порта, номер порта берется из Settings.Port
    *)
    COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=0 );
    com_ready:=FALSE;
    ELSE
    COM_SERVICE1.Enable:=FALSE;
    com_ready:=TRUE;
    END_IF



    IF com_ready=TRUE THEN
    (*Порт открыт и инициализирован, теперь можно работать с портом*)
    IF i<32000 THEN
    SysComRead(Settings.Port, ADR(buffer),100,0);
    i:=i+1;
    END_IF
    END_IF

    IF m=1 THEN
    m:=0;
    END_IF

    WHILE m<>1 DO
    WHILE buffer[a]<>38 DO
    a:=a+1;
    END_WHILE

    IF buffer[a]=38 THEN
    a:=a+1;
    IF buffer[a]=65 THEN
    a:=a+1;
    CASE buffer[a] OF
    32: dif_pressure:=buffer[a+1]*1000+buffer[a+2]*100+buffer[a+3]*10+buffer[a+4]+0.1*buffer[a+6];
    m:=1;
    45: dif_pressure:=-(buffer[a+1]*1000+buffer[a+2]*100+buffer[a+3]*10+buffer[a+4]+0.1*buffer[a+6]);
    m:=1;
    ELSE
    a:=a+1;
    END_CASE
    ELSE
    a:=a+1;
    END_IF
    ELSE
    a:=a+1;
    END_IF
    END_WHILE

    IF i=32000 THEN
    i:=0;
    END_IF

    IF a<>0 THEN
    a:=0;
    END_IF
    Последний раз редактировалось Angelina69; 30.05.2022 в 23:39.

  7. #8837

    По умолчанию

    Добрый вечер. Как можно зафиксировать значение T_1 и T_2 и при дальнейшем увеличении температуры T_1и T_2 не менялись.
    START_TIME:=TIME();
    IF ACT_1 =20.2 THEN
    TIME_111.T_1 := TIME() ;
    END_IF
    IF ACT_1 = 25 THEN
    TIME_111.T_2 := TIME() ;
    END_IF
    SUM_1:=TIME_TO_REAL (TIME_111.T_2 -TIME_111.T_1);
    SUM_2 := REAL_TO_TIME (SUM_1);

  8. #8838
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,246

    По умолчанию

    Код:
    IF xStart AND NOT xOldStart THEN
        xFlag1 := TRUE;
        xFlag2 := TRUE;
        tmSUM := T#0s;
    END_IF;
    IF ACT_1 > 25.0 AND xFlag2 THEN
        tmSUM := TIME() - tmFirst;
        xFlag2 := FALSE;
    ELSIF ACT_1 > 20.2 AND xFlag1 THEN
        tmFirst := TIME();
        xFlag1 := FALSE;
    END_IF;
    xOldStart  := xStart ;
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #8839
    Пользователь
    Регистрация
    11.01.2021
    Адрес
    Самара
    Сообщений
    43

    По умолчанию

    Колеги добрый день! Помогите разобраться, вроде всё просто но никак не разберусь. Связка ПР 103 и ПЛК 150, ПЛК 150 опрашивает регистр ПР 103 го, в ПР програмно BLINK задаёт импульсы счётчик 32 БИТ считает, как добиться чтобы счётчик не переполнялся счёт нужен до 5 ти млн. В ПЛК значения вижу но при наполнении обнуляется и так по кругу.

  10. #8840

    По умолчанию

    Цитата Сообщение от LAGOOPED Посмотреть сообщение
    Колеги добрый день! Помогите разобраться, вроде всё просто но никак не разберусь. Связка ПР 103 и ПЛК 150, ПЛК 150 опрашивает регистр ПР 103 го, в ПР програмно BLINK задаёт импульсы счётчик 32 БИТ считает, как добиться чтобы счётчик не переполнялся счёт нужен до 5 ти млн. В ПЛК значения вижу но при наполнении обнуляется и так по кругу.
    Какие типы данных передаёте и принимаете?
    Считает до 65535 ? Сколько регистров (или Байт) в переменной счётчика в ПР и сколько в переменной в ПЛК ?
    Последний раз редактировалось kondor3000; 01.06.2022 в 09:35.

Страница 884 из 1044 ПерваяПервая ... 384784834874882883884885886894934984 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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