PDA

Просмотр полной версии : Буферизация сетевых переменных



anthrwpos
20.08.2018, 09:56
Столкнулся с проблемой связанной с тем, что программный цикл может изменить переменные прям во время сетевой передачи, так что часть считанных переменных будет иметь значения прошлого цикла, часть - следующего.
Как бы их забуферизивать, чтобы передавать всегда цельное состояние?

Пока не нашел ничего лучше, чем
1) менять сетевые переменные раз в секунду
2) передавать специальный контрольный бит, который равен нулю в течении четверти секунды до и после смены состояния.
3) данные принятые с контрольным битом равным нулю отбрасываются.

Ревака Юрий
20.08.2018, 10:02
Столкнулся с проблемой связанной с тем, что программный цикл может изменить переменные прям во время сетевой передачи, так что часть считанных переменных будет иметь значения прошлого цикла, часть - следующего.
Как бы их забуферизивать, чтобы передавать всегда цельное состояние?

Пока не нашел ничего лучше, чем
1) менять сетевые переменные раз в секунду
2) передавать специальный контрольный бит, который равен нулю в течении четверти секунды до и после смены состояния.
3) данные принятые с контрольным битом равным нулю отбрасываются.

Добрый день, можете подробнее описать Вашу задачу, сетевые переменные это не параллельный интерфейс:), работа с модбасом ведется в определенных временных окнах, и нет гарантии что все существующие будут переданы в одном сеансе, а если приложить сюда возможные сбои, повторные запросы и.т.д, то задача вообще не решаема.

anthrwpos
20.08.2018, 13:42
Есть несколько макросов, имитирующих массивы. Значения массивов передаются по сети по очереди. Параллельно с массивами есть счетчик номера текущего передаваемого элемента. Скада ведет историю каждого элемента массива индивидуально, поэтому очень важно, чтобы переданный элемент соответствовал переданному номеру. Иначе записываемая история оказывается некорректна.
Можно было бы "развернуть" массивы и передавать все элементы "параллельно", но это очень много элементов и вообще получится ненужная каша.

Ревака Юрий
20.08.2018, 13:56
Есть несколько макросов, имитирующих массивы. Значения массивов передаются по сети по очереди. Параллельно с массивами есть счетчик номера текущего передаваемого элемента. Скада ведет историю каждого элемента массива индивидуально, поэтому очень важно, чтобы переданный элемент соответствовал переданному номеру. Иначе записываемая история оказывается некорректна.
Можно было бы "развернуть" массивы и передавать все элементы "параллельно", но это очень много элементов и вообще получится ненужная каша.

Что за задача таким способом решается? Зачем такая строгость по времени передачи каждого элемента, или таким образом решаете вопрос экономии сетевых переменных?

Ревака Юрий
20.08.2018, 14:53
Имею необходимость передавать в сетевых переменных например или 6 интов, или 3 флоата в те же адреса, по флагу номера экрана от читающей системы. То есть отдавать разнокалиберные сетевые переменные в те же адреса. Возможно ли это? Всё от ограниченности сетевого буфера на ПР200 (слейв), не хватает адресов.

В одни и те же, сомневаюсь, тип переменной ведь настраивается в проекте и менять его из программы нельзя.

melky
20.08.2018, 16:59
Серёга Букашкин для такого варианта еще и Scada надо научить раскладывать переменные по полочкам. Не все умеют, если вообще кто такое умеет.
Отдельным драйвером или скриптом возможно научить, но стоит ли потраченное время на это ?

anthrwpos
20.08.2018, 17:00
Что за задача таким способом решается? Зачем такая строгость по времени передачи каждого элемента, или таким образом решаете вопрос экономии сетевых переменных?
Массив имитирует адресуемые регистры условного процессора, позволяет например, использовать всего один макрос для обработки однотипных данных, использовать динамическую память (позволяет технологу делить процесс на нужное ему число периодов в течении суток, не загромождая программу набором однотипных переменных, и не создавая однотипных экранов для задания этих периодов), имитировать циклы, и даже создавать динамически изменяющиеся алгоритмы.
Ну и одно из применений - экономия сетевых переменных.

ЗЫ Лоджик конечно сильно ограниченная в средствах система, но как видим, многие из них можно при желании эмулировать. Но отсутствие возможности отслеживания разных событий - это просто катастрофа. События ввода, чтения/записи данных, навигации по экранам и так далее. Очень стоило бы эту дыру заделать, это повысит юзабельность Лоджика в сотню раз.

anthrwpos
20.08.2018, 17:03
Имею необходимость передавать в сетевых переменных например или 6 интов, или 3 флоата в те же адреса
Можно написать конвертер, переводящий флоат в мантиссу и экспоненту, передавать их в качетсве интов, после передачи - собирать обратно в флоат.

melky
20.08.2018, 17:06
anthrwpos, то есть мантиссу в одном инте, а экспоненту в другом инте и получим те же два регистра или как ?
тут по моему самое основное и глобальное - "в те же адреса" вопрос с приемом остается открытым

Сергей0308
20.08.2018, 17:14
Неужели нельзя FLOAT умножить на 10 в энной степени(требуемое количество знаков после запятой) и передать целочисленной переменной?!

anthrwpos
20.08.2018, 17:51
anthrwpos, то есть мантиссу в одном инте, а экспоненту в другом инте и получим те же два регистра или как ?
тут по моему самое основное и глобальное - "в те же адреса" вопрос с приемом остается открытым
Мантисса числа флоат занимает 23 бит, экспонента 8 бит и знак 1 бит. Итого чтобы их передать, нужно в точности два 16-битных инта.
Флоат на википедии (https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8% D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D 1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8)

melky
20.08.2018, 20:27
anthrwpos сакральный смысл передачи 4 байт вместо 4 байт ? :)

anthrwpos
22.08.2018, 08:50
anthrwpos сакральный смысл передачи 4 байт вместо 4 байт ? :)
Скорее вопрос - для чего вообще нужно передавать инт и флоат в один адрес? Если надо экономить - проще передавать в один адрес несколько флоатов или несколько интов, но никак не те и другие сразу.