Siemens AG
Список форумов SIEMENS, Россия. IA&DT
   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Создание цикла опроса 2-х модбас устройств

 
Начать новую тему   Ответить на тему    Список форумов SIEMENS, Россия. IA&DT -> Промышленное программное обеспечение
Предыдущая тема :: Следующая тема  
Автор Сообщение
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Сб Окт 20, 2012 9:20    Заголовок сообщения: Создание цикла опроса 2-х модбас устройств Ответить с цитатой

2 расходчика подключены к контроллеру S7-314-2DP через CP341 RS485/422. Протокол передачи - Модбас РТУ. Каждый отвечает на запрос - раз в 4 секунды.
Нужно организовать опрос этих расходчиков:
Записывать число "1" и "2" (номера слейвов модбас) в блок данных(скажем DB1.DBB0) поочередно, с интервалом 10 сек.
Когда записана цифра "1", переслать содержимое байтов блока данных DB2 в DB3(перевернув прочитать как REAL). Также для второго адреса расходчика.
DB2.DBB0 ----> DB3.DBB3
DB2.DBB1 ----> DB3.DBB4
DB2.DBB2 ----> DB3.DBB1
DB2.DBB3 ----> DB3.DBB2

Так как делаю,описано ниже. Опрос не осуществляется. Вроде бы задача то простая, но не выходит.

NETW1

AN T1
AN T2
JCN _001
M1.0

_001: A T1
AN T2
JCN _002
M1.1

_002: AN T2
A T1
JCN _003
M1.2

_003: A T1
A T2
JCN _004
M1.3

_004: NOP 0

NETW2

A M1.0
AN T2
FR T1
S5T#10S
SE T1

AN T1
FR T2
L S5T#10S
SE T2

NETW3
A T1
L B#16#1
T DB2.DBB0

A T1
L DB2.DBB0
T DB3.DBB3

L DB2.DBB1
T DB3.DBB4

L DB2.DBB2
T DB3.DBB0

L DB2.DBB3
T DB3.DBB1

NETW4

A T1
L B#16#2
T DB2.DBB0

A T1
L DB2.DBB0
T DB3.DBB3

L DB2.DBB1
T DB3.DBB4

L DB2.DBB2
T DB3.DBB0

L DB2.DBB3
T DB3.DBB1

Проверьте пожалуйста, если есть свои версии пишите. У меня пока ничего не выходит.
Спасибо
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Cerberus
Писатель со стажем


Зарегистрирован: 30.10.2006
Сообщения: 809
Откуда: Украина, Днепродзержинск

Сообщение Добавлено: Сб Окт 20, 2012 13:27    Заголовок сообщения: Ответить с цитатой

Код:
      A     M     20.0
      AN    T      2

      L     "T_SE"
      SE    T      1

      AN    T      1
      L     "T_SP"
      SP    T      2

      A     T      2
      =     M     20.1
 
     JCN   m1
      L     3
      T     MW    22
      JU    end
m1:   NOP   0
      L     6
      T     MW    22
end:  NOP   0

Это пример для решения Вашей задачи.
Я вот только не пойму зачем Вам дополнительный признак (я о "цифре 1")? Пишите значения из одного блока в другой в этих местах:
Код:
    L     3
      T     MW    22

Код:
    L     6
      T     MW    22
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Сб Окт 20, 2012 14:17    Заголовок сообщения: Ответить с цитатой

Спасибо, попробую.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Maxim_85
Известный Писатель


Зарегистрирован: 18.12.2011
Сообщения: 137
Откуда: моск.обл

Сообщение Добавлено: Сб Окт 20, 2012 15:09    Заголовок сообщения: Re: Создание цикла опроса 2-х модбас устройств Ответить с цитатой

denchik писал(а):



A T1
L B#16#2
T DB2.DBB0

A T1
L DB2.DBB0
T DB3.DBB3


Инструкции загрузки/выгрузки L/T выполнятются внезависимости от RLO. Посему загрузка/выгрузка произойдет вне зависимости от результата
A T1. Если вы хотите делать загрузку/выгрузку по условию, то надо делать условные переходы, а не так просто, как вы написали.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Сб Окт 20, 2012 15:59    Заголовок сообщения: Re: Создание цикла опроса 2-х модбас устройств Ответить с цитатой

Maxim_85 писал(а):
denchik писал(а):



A T1
L B#16#2
T DB2.DBB0

A T1
L DB2.DBB0
T DB3.DBB3


Инструкции загрузки/выгрузки L/T выполнятются внезависимости от RLO. Посему загрузка/выгрузка произойдет вне зависимости от результата
A T1. Если вы хотите делать загрузку/выгрузку по условию, то надо делать условные переходы, а не так просто, как вы написали.


Начало доходить...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Сб Окт 20, 2012 16:02    Заголовок сообщения: Ответить с цитатой

Вот что у меня получилось:
Код:
Network  1
      AN    T     32
      =     M    116.0

Network 2
      A     M    116.0
      L     S5T#30S
      SE    T     32
      A     M    116.4
      R     T     32
      L     T     32
      T     MW   118
      LC    T     32
      T     MW   135
      A     T     32
      =     M    116.3

Network 3
      L     MW   118
      L     290
      >I   
      =     L      0.0
      A     L      0.0
      JNB   _001
      L     1
      T     "SOURCE_DB".slave_address
      SET   
      SAVE 
      CLR   
_001: A     BR
      =     M    116.2
      A     L      0.0
      BLD   102
      =     M    120.7

Network 4
      AN    DB42.DBX    0.1

      L     "DESTINATION_DB".a[1]
      T     DB3.DBB   38
      L     "DESTINATION_DB".a[2]
      T     DB3.DBB   39
      L     "DESTINATION_DB".a[3]
      T     DB3.DBB   36
      L     "DESTINATION_DB".a[4]
      T     DB3.DBB   37

Network 5
      A(   
      L     MW   118
      L     150
      <=I   
      )     
      A(   
      L     MW   118
      L     140
      >=I   
      )     
      =     L      0.0
      A     L      0.0
      JNB   _002
      L     2
      T     "SOURCE_DB".slave_address
      SET   
      SAVE 
      CLR   
_002: A     BR
      =     M    116.1
      A     L      0.0
      BLD   102
      =     M    120.7

Network 6
      A     DB42.DBX    0.1

      L     "DESTINATION_DB".a[1]
      T     DB3.DBB    2
      L     "DESTINATION_DB".a[2]
      T     DB3.DBB    3
      L     "DESTINATION_DB".a[3]
      T     DB3.DBB    0
      L     "DESTINATION_DB".a[4]
      T     DB3.DBB    1



Насчет переходов - это каждую операцию нужно писать отдельно ?
Т.е как то так:
Код:

     AN     DB42.DBX    0.1
      JCN _001
      L     "DESTINATION_DB".a[1]
      T     DB3.DBB   38
      L     "DESTINATION_DB".a[2]
      T     DB3.DBB   39
      L     "DESTINATION_DB".a[3]
      T     DB3.DBB   36
      L     "DESTINATION_DB".a[4]
      T     DB3.DBB   37

_001: A DB42.DBX    0.1
      JCN _002
      L     "DESTINATION_DB".a[1]
      T     DB3.DBB    2
      L     "DESTINATION_DB".a[2]
      T     DB3.DBB    3
      L     "DESTINATION_DB".a[3]
      T     DB3.DBB    0
      L     "DESTINATION_DB".a[4]
      T     DB3.DBB    1
_002: NOP 0
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Вс Окт 21, 2012 9:37    Заголовок сообщения: Ответить с цитатой

Я так понял, что для каждй операции загрузки выгрузки, нужно писать метку ?
Написал так, у меня он на _200-ю и _300 метку одновременно прыгает. Я уже запутался, вроде все правильно ?
Код:

A     DB42.DBX    0.0
      JCN   _100
      L     "DESTINATION_DB".a[1]
      JU    _200

_100: AN    DB42.DBX    0.0
      L     "DESTINATION_DB".a[1]
      JU    _300

_200: T     DB3.DBB    2

_300: T     DB3.DBB   38
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Cerberus
Писатель со стажем


Зарегистрирован: 30.10.2006
Сообщения: 809
Откуда: Украина, Днепродзержинск

Сообщение Добавлено: Вс Окт 21, 2012 12:51    Заголовок сообщения: Ответить с цитатой

Во-первых, у Вас данные берутся из одной и той же области, не знаю ошибка это или нет, просто обратите внимание
Код:
 L     "DESTINATION_DB".a[1]

Во-вторых, после выполнения строки
Код:
_200: T     DB3.DBB    2

строка
Код:
T     DB3.DBB   38

тоже ВЫПОЛНИТСЯ! и в неё будет записано то же, что и в DB3.DBB2.
Я бы вообще сделал примерно так:
Код:
      A     DB42.DBX    0.0
      JCN   _100
      L     "DESTINATION_DB".a[1]
      T     DB3.DBB    2
      JU    _200

_100: NOP 0
      L     "DESTINATION_DB".a[1]
      T     DB3.DBB   38
_200: NOP 0
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Вс Окт 21, 2012 14:46    Заголовок сообщения: Ответить с цитатой

Cerberus писал(а):
Во-первых, у Вас данные берутся из одной и той же области, не знаю ошибка это или нет, просто обратите внимание
Код:
 L     "DESTINATION_DB".a[1]


Все правильно.
Просто я получаю данные с расходчиков в один и тот же ДБ. При значении бита адреса DB42.DBX 0.1 = "1"(первый адрес - первый расходчик) получаю данные с 1-го расходчика. Так же со вторым.
Я попробовал код, строка все также выполняется...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Вс Окт 21, 2012 19:52    Заголовок сообщения: Ответить с цитатой

Мне кажется я изначально что то неправильно сделал. Для цикла у меня используется один таймер в 30сек, он сам себя перезапускает. 1-й модбас слейв опрашивается на 15 секунде, 2-й на 30-й секунде.
Может как то по другому организовать цикл ? Потому что цикл
Код:
A     DB42.DBX    0.0
      JCN   _100
      L     "DESTINATION_DB".a[1]
      JU    _200

_100: AN    DB42.DBX    0.0
      L     "DESTINATION_DB".a[1]
      JU    _300

_200: T     DB3.DBB    2

_300: T     DB3.DBB   38

вроде правильный, а у меня идет запись в оба ДБ одновременно ...[/code]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Maxim_85
Известный Писатель


Зарегистрирован: 18.12.2011
Сообщения: 137
Откуда: моск.обл

Сообщение Добавлено: Пн Окт 22, 2012 7:12    Заголовок сообщения: Ответить с цитатой

Ну у вас и будет в оба поля записываться вне зависимости от ваших проверок.

Можно сделать так:
Код:


          L     "DESTINATION_DB".a[1]
          A     DB42.DBX    0.0
          JCN   _001
          T     DB3.DBB    2
          JU     _002
_001:     T DB3.DB   38

_002: NOP 0

 
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Пн Окт 22, 2012 7:41    Заголовок сообщения: Ответить с цитатой

Maxim_85 писал(а):
Ну у вас и будет в оба поля записываться вне зависимости от ваших проверок.

Можно сделать так:
Код:


          L     "DESTINATION_DB".a[1]
          A     DB42.DBX    0.0
          JCN   _001
          T     DB3.DBB    2
          JU     _002
_001:     T DB3.DB   38

_002: NOP 0

 

Спасибо, попробовал. Все равно записывает в оба поля...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Cerberus
Писатель со стажем


Зарегистрирован: 30.10.2006
Сообщения: 809
Откуда: Украина, Днепродзержинск

Сообщение Добавлено: Пн Окт 22, 2012 14:33    Заголовок сообщения: Ответить с цитатой

Да каким образом у Вас всё равно пишется в оба блока данных!?
Приведите весь код Вашего блока!

P.S. Правда ответ смогу дать только через сутки, потому как сейчас на объекте.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Пн Окт 22, 2012 18:54    Заголовок сообщения: Ответить с цитатой

Cerberus писал(а):
Да каким образом у Вас всё равно пишется в оба блока данных!?
Приведите весь код Вашего блока!

P.S. Правда ответ смогу дать только через сутки, потому как сейчас на объекте.

Ok.

Network 1: Таймер - запуск самого себя

Код:
 AN    T     32
      =     M    116.0


Network 2:

Код:
 A     M    116.0
      L     S5T#20S
      SE    T     32
      NOP   0
      L     T     32
      T     MW   118
      NOP   0
      A     T     32
      =     M    116.3


Network 3: Если число времени находится в промежутке между 20-й и 10-й секунды, установить
бит в единицу, тем самым указав номер слейва "1"

Код:
A(   
      L     MW   118
      L     200
      <I   
      )     
      A(   
      L     MW   118
      L     100
      >I   
      )     
      =     DB42.DBX    0.0


Network 4: Если число времени находится в промежутке между 10-й и 0-й секунды, установить
бит в единицу, тем самым указав номер слейва "2"

Код:
 A(   
      L     MW   118
      L     100
      <I   
      )     
      A(   
      L     MW   118
      L     0
      >I   
      )     
      =     DB42.DBX    0.1


Network 5: Если адрес слейва "1", то переслать содержимое байтов в блоке ДБ43, с переменой
мест младших со старшими байтами в каждом слове. Считываем все 4 байта, отбираем в FLOATING_POINT.

Код:
  L     "DESTINATION_DB".a[1]
      A     DB42.DBX    0.0
      JCN   _100
      T     DB3.DBB    2
      JU    _200
_100: T     DB3.DBB   38
_200: NOP   0



      L     "DESTINATION_DB".a[2]
      A     DB42.DBX    0.0
      JCN   _101
      T     DB3.DBB    3
      JU    _201
_101: T     DB3.DBB   39
_201: NOP   0



      L     "DESTINATION_DB".a[3]
      A     DB42.DBX    0.0
      JCN   _102
      T     DB3.DBB    0
      JU    _202
_102: T     DB3.DBB   36
_202: NOP   0



      L     "DESTINATION_DB".a[4]
      A     DB42.DBX    0.0
      JCN   _103
      T     DB3.DBB    1
      JU    _203
_103: T     DB3.DBB   37
_203: NOP   0

// 11111111111111111111111111111111111111111111111

      L     "DESTINATION_DB".a[1]
      A     DB42.DBX    0.0
      JCN   _104
      T     DB3.DBB    6
      JU    _204
_104: T     DB3.DBB   42
_204: NOP   0



      L     "DESTINATION_DB".a[2]
      A     DB42.DBX    0.0
      JCN   _105
      T     DB3.DBB    7
      JU    _205
_105: T     DB3.DBB   43
_205: NOP   0



      L     "DESTINATION_DB".a[3]
      A     DB42.DBX    0.0
      JCN   _106
      T     DB3.DBB    4
      JU    _206
_106: T     DB3.DBB   40
_206: NOP   0



      L     "DESTINATION_DB".a[4]
      A     DB42.DBX    0.0
      JCN   _107
      T     DB3.DBB    5
      JU    _207
_107: T     DB3.DBB   41
_207: NOP   0

//... и так до

      L     "DESTINATION_DB".a[29]
      A     DB42.DBX    0.0
      JCN   _128
      T     DB3.DBB   30
      JU    _228
_128: T     DB3.DBB   66
_228: NOP   0



      L     "DESTINATION_DB".a[30]
      A     DB42.DBX    0.0
      JCN   _129
      T     DB3.DBB   31
      JU    _229
_129: T     DB3.DBB   67
_229: NOP   0



      L     "DESTINATION_DB".a[31]
      A     DB42.DBX    0.0
      JCN   _130
      T     DB3.DBB   28
      JU    _230
_130: T     DB3.DBB   64
_230: NOP   0



      L     "DESTINATION_DB".a[32]
      A     DB42.DBX    0.0
      JCN   _131
      T     DB3.DBB   29
      JU    _231
_131: T     DB3.DBB   65
_231: NOP   0
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Maxim_85
Известный Писатель


Зарегистрирован: 18.12.2011
Сообщения: 137
Откуда: моск.обл

Сообщение Добавлено: Пн Окт 22, 2012 20:04    Заголовок сообщения: Ответить с цитатой

У вас в нетворке 5 только первый слейв обрабатывается? просто DB42.DBX 0.0 -это первый слейв, DB42.DBX 0.1- это второй слейв
В нетворке 5 вы используете только DB42.DBX 0.0. В любом случае, зачем столько логических проверок одного и тоже условия?? Если у вас условие выполняется, то и делайте все необходимые действия(причем в а вашем случае напрашивается цикл), зачем перед каждым чихом проверять? Просто читаемость никакая вашего кода
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
denchik
Начинающий писатель


Зарегистрирован: 05.04.2012
Сообщения: 79
Откуда: Tien Shan Engineering LLC Almaty

Сообщение Добавлено: Пн Окт 22, 2012 22:19    Заголовок сообщения: Ответить с цитатой

Maxim_85 писал(а):
У вас в нетворке 5 только первый слейв обрабатывается? просто DB42.DBX 0.0 -это первый слейв, DB42.DBX 0.1- это второй слейв
В нетворке 5 вы используете только DB42.DBX 0.0. В любом случае, зачем столько логических проверок одного и тоже условия?? Если у вас условие выполняется, то и делайте все необходимые действия(причем в а вашем случае напрашивается цикл), зачем перед каждым чихом проверять? Просто читаемость никакая вашего кода

У меня всего слейвов - 2. Т.е. либо адрес "1" либо нет(какой-то другой), а это может быть только "2".

Maxim_85 писал(а):
зачем перед каждым чихом проверять?

Я понял, что вы имеете ввиду. А вы попробуйте сделать загрузку и отправку по одному условию, даже через цикл. У меня не получилось. А то, что там в каждом прыжке проверка одного и того же условия - это последний, на тот момент, вариант моих мучений ))) истерика в общем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Maxim_85
Известный Писатель


Зарегистрирован: 18.12.2011
Сообщения: 137
Откуда: моск.обл

Сообщение Добавлено: Вт Окт 23, 2012 4:07    Заголовок сообщения: Ответить с цитатой

Цикл может выглядеть так(если я правильно понял, что вы хотите)
Код:

      A     DB42.DBX    0.0
      =     M     42.0
      L     0
      LAR1 
_001: OPN   "DESTINATION_DB"  //откуда берем данные
      L     DBW [AR1,P#2.0]
      L     DBW [AR1,P#0.0]
      OPN   DB     3                  //куда пишем
      A     M     42.0
      JCN   _002                      //тут вилка
      T     DBW [AR1,P#2.0]
      TAK   
      T     DBW [AR1,P#0.0]
      JU    _003
_002: T     DBW [AR1,P#38.0]
      TAK   
      T     DBW [AR1,P#36.0]
_003: L     4
      SLW   3
      +AR1 
      TAR1 
      L     32        //номер байта x8(в данном случае до 4 байта)
      ==I   
      JCN   _001


Причем вышеприведенный код даже не цикл, т.к. будет выполняться лишь один проход и будет обработано 4 байта (2 слова). Тем самым сделается то, что вас до
//11111111111
Ну а далее этот же цикл, только уже с соотвествующим пределом.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов SIEMENS, Россия. IA&DT -> Промышленное программное обеспечение Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB 2.0.11 © 2001, 2002 phpBB Group