PDA

Просмотреть полную версию : Слить ARRAY из SMH2010


dmd
30.11.2010, 16:37
Контроллер SMH2010
На нём, в SMLogix, реализовано управление технологическим оборудованием. В процессе работы в ARRAY(int) пишутся некие данные, около 1000 записей.

Есть задача, по окончании работы, вычитать из контроллера эти данные и сохранить их на компьютере.

Эта задача реализуема? Если да, каким образом. Есть какое-нибудь howto?

Arsie
30.11.2010, 16:51
Контроллер SMH2010
На нём, в SMLogix, реализовано управление технологическим оборудованием. В процессе работы в ARRAY(int) пишутся некие данные, около 1000 записей.

Есть задача, по окончании работы, вычитать из контроллера эти данные и сохранить их на компьютере.

Эта задача реализуема? Если да, каким образом. Есть какое-нибудь howto?

Реализуема. Задача разбивается на несколько:

1) Запись информации в ARRAY - это у вас есть.

2) Чтение информации из ARRAY

3) Передача на компьютер (протокол)

4) Обработка на компьютере

Далее разбиваете на подзадачи, подгоняя к вашим требованиям и выбираете способ (протокол) передачи и метод синхронизации между задачами и внутри задач.

Программируете.

Всё.

PS. Блочного чтения в наших контроллерах нет.


.

dmd
30.11.2010, 18:31
1) Запись информации в ARRAY - это у вас есть.

2) Чтение информации из ARRAY

3) Передача на компьютер (протокол)

4) Обработка на компьютере

вопрос был именно о пунктах 2 и 3.

протокол modbus. блочного чтения нет. адресуются только modbus-переменные, среди которых array нет.

получается, что единственный способ -- читать поэлементно данные из array в modbus-переменную, которую запрашивать из контроллера функцией 04 Read Input Registers.

я всё верно понял?

Arsie
01.12.2010, 15:03
вопрос был именно о пунктах 2 и 3.

протокол modbus. блочного чтения нет. адресуются только modbus-переменные, среди которых array нет.

получается, что единственный способ -- читать поэлементно данные из array в modbus-переменную, которую запрашивать из контроллера функцией 04 Read Input Registers.

я всё верно понял?


Схема передачи массива со внутренней синхронизацией.

Исходные данные:

а) Передача массива исключительно целиком

б) Внешний строб начала передачи

в) Во время передачи память свободна от операций чтения/записи (рабочий цикл основного алгоритма закончен)

Исходя из поставленной задачи выбираем:

- метод чтения из памяти - без синхронизации по готовности

- метод передачи - единый блок на единицу данных, синхронизация внутренняя

- метод остановки передачи - по окончанию передачи всего массива

Задача "передача данных" в данных условиях делится на подзадачи:

Система управления передачей, состоящая из схемы сброса в исходное состояние (2) и схемы разрешения передачи (1)

(3) Тактовый и адресный генераторы

(4) Счётчик адреса

(5) Схема синхронизации потока

Подзадачи выделены на картинке серыми рамками под своими номерами.

Итого, программа состоит из:

1) Схема разрешения передачи обеспечивает запуск передачи и её останов по достижению счётчиком верхней границы массива

2) Схема сброса отключает адресный счётчик и приводит в исходное состояние схему синхронизации в то время, когда массив не передаётся

3) Т.к. выбран метод счения из памяти без синхронизации, то тактовый и адресный генераторы представляют собой единый узел. Блок AND обеспечивает функцию управления генератором (запуск/останов), блок NOT является собственно генератором импульсов

4) Счётчик обеспечивает перебор массива от 0 до 9, т.е. всего 10 ячеек

5) Схема синхронизации потока обеспечивает чёткое соответствие между сигналом данных и сервисными сигналами. Т.е. синхронизирует их во времени

Ограничения, наложенные алгоритмом:

а) Нет проверки на занятость памяти, поэтому если она всё же занята, то чтение будет выполнено с ошибкой и нет способа это проконтролировать

б) На передачу одного элемента массива тратится 2 цикла системы

в) Чтение данных должно выполняться групповым запросом (т.е. блочно), иначе возможна рассинхронизация потока. Для обеспечения этой возможности все сигналы имеют единый формат. Частота опроса переменных контроллера должна быть не менее двухкратной частоте работы программы. Т.е. если программа выполняется за 100 мсек, то опрос переменных должен происходить каждые 50 мсек

Описание работы:

A) При нажатии кнопки "1" управляющий D-триггер #1 переключается в единицу, чем обеспечивает включение тактового генератора и отключение (через блок NOT #3) сигнала сброса со счётчика CNTR(16) #6 и синхронизирующих триггеров RS #5 и ^REG(int) #8

B) С выхода блока AND #2 единица подаётся на вход "start rd" блока памяти ARRAY(int) #9, чем вызывает чтение ячейки массива по нулевому адресу

C) Инвертор NOT #4 обеспечивает отключение блока AND #2 и пропадание сигнала на чтение из блока памяти

D) После пропадания сигнала на чтение из блока памяти инвертор NOT #4 обеспечивает включение триггера начала передачи RS #5, также он осуществляет тактирование синхронизирующего триггера ^REG(int) #8 и счётчика CNTR(16) #6

E) В этот момент первый блок данных сформирован: ПЕРЕДАЧА=1, АДРЕС=0, ДАННЫЕ="xxxxx"

E1) Переменная "ПЕРЕДАЧА" принимает значение "1", показывая внешнему серверу, что инициирована передача данных

E2) Переменная "Адрес" принимает значение "0", показывая внешнему серверу, что происходит чтение нулевого элемена массива

E3) Переменная "Данные" в это время уже содержит действительные данные нулевой ячейки массива

F) Далее инвертор NOT #4 вызывает очередное переключение тактового генератора: всё повторяется с шага (B) ещё девять раз

G) После того как счётчик CNTR(16) #6 досчитал до 9 очередное переключение генератора вызывает появление "1" на выходе переполнения счётчика. Этот сигнал поступает на сброс управляющего D-триггера #1 и переводит его в исходное (нулевое) состояние. "0" с выхода триггера активирует сигнал сброса счётчика CNTR(16) #6 и синхронизирующих триггеров RS #5 и ^REG(int) #8 посредством блока NOT #3

H) Система закончила работу и ожидает новое нажатие кнопки "1" контроллера

dmd
01.12.2010, 23:00
Схема передачи массива со внутренней синхронизациейспасибо за развёрнутый ответ. мысль ясна