Продукты

                            
    Коллекция алгоритмов БиоСофт. История создания.
    
    Три первых алгоритма работали по жесткой схеме.
    
    Это  были алгоритмы управления по:
                                     
1. Ph и Do;
2. По градиенту Ph и Do;
3. По экспоненте.
  
Вышеперечисленные алгоритмы имели определенные недостатки, а именно:  они работали по заданной схеме, в то время как изменению подлежали  только параметры.

Так, например, первый алгоритм предусматривал работу в трех фазах - анализ параметров  ферментации, подача субстрата и, наконец, пауза. Последовательность этих операций было неизменной, но можно было менять длительность  фаз.

Поэтому было принято решение использовать стандарт S88 разработаный в ISA, который позволил бы осуществлять реализацию биопроцесса  по рецепту.
 
 Фактически был разработан алгоритмический язык БиоСофт-88 (BS88),  напоминающий язык SFC, который достаточно широко известен в автоматизации.
             
Для того, чтобы программа (рецепт) на языке БиоСофт-88 могла работать, был создан процессор языка в виде интерпретатора команд.

Название языка и процессора,  БиоСофт-88 возникло благодаря  названию стандарта - S88, упомянутому выше и приведенному в приложении. 

Описание языка БиоСофт-88.
--------------------------------------

Реализация Биопроцесса по рецепту состоит из операций и фаз.

Рассмотрим работу БС88 в пределах одной операции.                       
Каждая фаза содержит несколько исполнительных команд (они же - операторы действия) и несколько условий перехода к другой фазе.  Уточнение: фаза может и не содержать операторов действия, но обязательно содержит хотя бы один оператор перехода.  

Например, исполняемый оператор запускает мотор  подачи воды, а условием перехода к другой фазе будет  достижение заданного уровня воды.
 
Приведем примеры фаз, соответсвующие алгоритму N 1 из коллекции Биософт. 
1. Ожидание, когда уровень Ph опустится до 7.2;
2. Запуск мотора подачи субстрата на 60 сек;
3. Пауза 1 час.

Приведем полностью рецепт. Однако, заметим для начала, что фаза должна начинаться с номера фазы, а заканчиваться чертой из деффисов (-------....------), в количестве не менее трех. Это будет способствовать наглядности. Для имени фазы используется любая буквенно-цифровая строка. И, заметим наконец, что после знака апострофа можно писать комментарии.

Итак, пример программы:
    
'Начало фазы 1
'после номера фазы следуют обязательно скобка и точка
1).  /my_oper1/ ' Это начало фазы один. /my_oper1/ - пример имени операции

trans 2 if $ph[0] < 7.2   'переход к фазе 2, когда ph < 7.2
---------------------   ' конец фазы

2). 
$motor=100 'включение мотора на сто процентов
trans 3 if $timer > 60 ' ждем одну минуту и переходим к фазе 3
--------------------------------

3).
$motor=0 ' выключаем мотор
trans 1 if $timer > 3600 ' пауза один час затем переход к первой фазе.
-------------------------------

Вот и вся программа.

Так  программа (рецепт) выглядит в редакторе SDK:

Пример рецепта в редакторе SDK

Без комментариев это выглядит весьма компактно.

1).  /my_oper1/ 
trans 2 if $ph[0] < 7.2
--------------------- 
2). 
$motor=100
trans 3 if $timer > 60
--------------------------------
3).
$motor=0
trans 1 if $timer > 3600
------------------------------

Не все понятно, поэтому сделаем уточнения.
Переменные начинаются со знака условной денежной единицы - $.

$ph[0] переменная, сродержащая измерение ph за текущую минуту. 
Если требуется измерение за момент времени, бывший 2 минуты назад, то следует использовать индекс [-2]. Так, например, что бы перейти к фазе 2, если прирост PH составит больше 0.1, используем:
         
trans 2 if $ph[0]-$ph[-1] > 0.1

Если индекс 0, то его можно опустить. Обозначение $ph[0]  - эквивалентно  $ph[].
Для примера, показатель DO, три минуты назад, запишется как $do[-3]
Итак, структура имени переменной следующая $ - имя - [],
где имя - сокращенное имя переменной в биоэксперте,строчные и прописные буквы не различаются.

$timer показывает сколько секунд прошло от старта фазы. 

$timer автоматически обнуляется при переходе к другой фазе.

$retro содержит время длительности предыдущей фазы.

$timer и $retro только ДЛЯ  ПЕРВОЙ  ОПЕРАЦИИ.


$age - возраст процесса от момента старта ДЛЯ ВСЕХ ОПЕРАЦИЙ.

$motor - переменная, обозначающая насос подачи субстрата. Мотор включается с  заданным числом процентов. 
Например, включаем мотор на 75% с помощью оператора:

$motor=75
 
Оператор:

$motor=0

остановит мотор.

Рассмотренный рецепт для подачи субстрата в зависимости от ph находится в виде файла рецепта с именем _subs_under_ph.rcp

Помимо интерпретатора, обеспечивающего работу рецепта, был разработан также 
SDK (от англ. software development kit) — комплект средств разработки рецепта, который позволяет специалистам по ферментации создавать и реализовывать рецепты. Фактически это исполняемый файл bs_s88.exe. 

SDK bs88 имеет интуитивный интерфейс и в пояснениях вряд ли нуждается.
Однако, перечислим возможности:

- bs88 содержит поле для редактирования рецепта;
- рецепт можно сохранить или загрузить как файл;
- можно назначить время старта и/или безусловного завершения рецепта 
  (аналогично коллекции алгоритмов);
- bs88 напрямую связан с БиоЭкспертом и имеет поле демонстрации переменных
  ферментации за 5 последних минут;
- можно оперативно менять 'мотор', т.е. использовать разные   насосы, обозначаемые в рецепте как $motor;
- можно стартовать с любой фазы рецепта.            
                         
        

Ниже приводим, некоторые сведения об особенностях программ и настройки оборудования. 

1. Правила автоматического формирования имени файла ферментации :
                                           
ммддччNN

мм-месяц
дд-день
чч-час
NN-номер ферментера.

2. Проверка.   Включение насоса на 10 сек. или 60 сек. можно делать - в любой момент.
Проверка происходит с интенсивностью подачи субстрата 50%. 
Проверку на 60 сек. можно использовать для подкачки субстрата вручную. 
Если биоэксперт в режиме on-line, то подкачка будет зарегистрирована..

3. Примечание для dcu-2 (Двойка)

Инструкция по настройке насосов 
-------------------------------------------------------------
Режимы насосов в dcu настраиваются следующим образом:

a). На панели dcu:
Afoam: cycle=10, puls=10, auto, sensivity=low
Level: режим=harvest, puls=10, auto, sensivity=low

б). Переключатели насосов на стойках dcu - auto.

ОБЯЗАТЕЛЬНО УБЕДИТЕСЬ В ТОМ, ЧТО НАСОСЫ НАСТРОЕНЫ ПРАВИЛЬНО. 
ДЛЯ ЭТОГО ВОСПОЛЬЗУЙТЕСЬ ПРОВЕРКОЙ ВКЛЮЧЕНИЕМ НАСОСОВ НА 10 ИЛИ 60 СЕКУНД ПОСРЕДСТВОМ bs88.
 
4. Примечание для аппликонов 

Подкачка субстрата осуществляет насосом АFoam (Он же насос уровня). Что бы этот насос работал по рецепту необходимо отключить цикл управления по датчику (control). 
                                                                   

Еще примеры рецептов:
                    
Был приведен рецепт управления по ph,


1).
trans 2 if $ph[0] < 7.2
--------------------- 
2). 
$motor=100
trans 3 if $timer > 60
--------------------------------
3).
$motor=0
trans 1 if $timer > 3600
------------------------------
                    
По случаю из реальной НИР, понадобилось видоизменить алгоритм управления по PH, а именно: начинать  анализ РН после того, как будут выполнены два условия: Изменится значение показателя BaseT и при этом PH должен быть меньше, допустим, 6.

Исполняем это пожелание добавляя в начало следующую фазу:
                                                        
0).
trans 1 if $ph[] < 6 AND  $BaseT[0]  >  $BaseT[-1]
--------------------

Здесь использована возможность bs88 составлять сложные условия путем использования знаков логики AND, а также OR (И,ИЛИ).

Еще пример, программа управления по экспоненте.

0).
$R1=50 'использована переменная $R1 для вычисления процентов накачки.
----------------------------
1).
$motor=$R1  
trans 2 if $timer>3600*3 ' накачка 3 часа
-----------------------------
2)
$motor=0
trans 3 if abs($do[0]-$do[-1])>5 ' ждем изменения DO на 5 по абсолютному значению
-----------------------------
3).
trans 4 if $retro > 0 AND $retro <= 60*5 ' переход на 4 фазу
trans 1 if $retro >  60*5 AND $retro < 60*10 ' переход на 1 фазу
trans 5 if $retro >  60*5  ' переход на 5 фазу
------------------------------
4).
$R1=$R1*1.1
trans 1
-------------------------------
5).
$R1=$R1/1.1
trans 1
--------------------------------

В данном примере используется функция абсолютного значения - abs(). И таких функций множество:

Abs    вычисляет абсолютное значение числа. 
ACos    Рассчитывает арккосинус числа. 
ASin     Рассчитывает арксинус числа. 
ATan     Рассчитывает арктангенс числа. 
Cos     Вычисляет косинус числа. 
Exp     Вычисляет экспоненту.
Int     Возвращает число, округленное вниз до ближайшего целого.
Log     Вычисляет натуральный логарифм числа. 
Mod     Выполняет операцию модуль. 
Random  Формирует случайное число с плавающей точкой. 
Round    Возвращает число, округленное до указанного количества десятичных     знаков. 
Sin     Вычисляет синус числа.
Sqrt     Рассчитывает квадратный корень числа. 
Tan     Вычисляет тангенс числа. 

И, наконец, поясним значение переменной $R1. Это одна из девяти переменных : 
$R1, $R2, $R3 и так далее до $R9, которые составитель рецепта может использовать по своему усмотрению. В примере с управлением по экспоненте,   переменная $R1 используется для хранения  процентов вращения насоса. 
Иногда целесообразно в начале рецепта присвоить преременным $Rn конкретные значения 
 с комментариями, а затем использовать эти переменные $Rn в рецепте. Таким образом, легко менять параметры рецепта. 

Примером этому приведем скорректированный рецепт управления по PH

----------------------------------------------------                                                               
0). ' фаза задания параметров рецепта
$R1=7.2     ' пограничный PH
$R2=100     ' скорость мотора
$R3=60         ' длительность накачки
$R4=60*60     ' длительность паузы
trans 1
-----------------------------------------------------
1).
trans 2 if $ph[0] < $R1
--------------------- 
2). 
$motor=$R2
trans 3 if $timer > $R3
--------------------------------
3).
$motor=0
trans 1 if $timer > $R4
------------------------------
                                                        
                                                               

Итак, короткая справка:
1. Фаза оформляется между n). и ---------

2. Используются переменные: 
$R1...$R9     - переменные составителя рецепта
$XYZ[-n]     - переменные  измерения параметров процесса
$timer        - длительность текущей фазы (меняется со временем)
$retro        - длительность прошлой фазы  (не меняется со временем)    
$motor        - задает вращение мотора (подачу субстрата)   

3.Операторы действия
$R1 = 10*$R2

4. Операторы перехода 
trans Метка_Фазы if Условие
trans Метка_Фазы

5. Оператор окончания рецепта
stop

6. Везде комментировать рецепт после знака апострофа.

7.Первая фаза всегда сопровождается именем операции между знаками // (слэш)

Дополнение:
Начиная с версии 3.1 пользователи могут использовать все переменные контроля одновременно. 
Это достигается оператором:
%переменная=значение
Например,

%stir=250

включает перемешивание на 250 об/мин.
В качестве имени переменной можно употреблять часть имени инсталированной переменной.
Регистр значения не имеет.

    
                                                     
Приложение A.  Стандарты, используемые при составлении рецепта. 

В БиоСофт88 используется стандарт S88 ISA. ISA - International Society of Automation – международное сообщество по автоматизации -  основано в 1945 году, штат Северная Каролина, США. S88 – стандарт автоматизации повторяющихся производственных процессов, разработанный ISA в 1995 году.
 
В 1995 году был утвержден один из первых стандартов ISA для управления периодическими процессами под названием ISA-S88 или просто S88. Этот стандарт обеспечил рамочные условия для проектирования и эксплуатации периодических производств, спецификацию, терминологию, модели процессов, структуры данных и многое другое. Фундаментальным достижением стало отделение рецептов от оборудования, что позволило создавать рецепты, не зависящие от оборудования. Это разделение позволяет упростить проектирование, эксплуатацию, а также  гибкое и динамичное  и обслуживание научно-исследовательского оборудования, в том числе в области экспериментальной биологии. Термин ‘Batch’, являющийся основным понятием S88, в данном изложении трактуется как биопроцесс. 

 
Следующим стандартом, используемым в BS88, является SFC. 
Язык последовательных функциональных схем SFC (Sequential Function Chart) является графическим языком, в котором программа описывается в виде схематической последовательности шагов, объединенных переходами. Язык SFC построен по принципу, близкому к концепции конечного автомата, что делает его одним из самых мощных языков программирования.  Разработан в NEMA - National Electrical Manufacturers Association (Национальная ассоциация производителей электроизделий, США) в 1979 году. 
Наиболее простым и естественным образом на языке SFC описываются технологические процессы, состоящие из последовательно выполняемых шагов, с возможностью описания нескольких параллельно выполняющихся процессов, для чего в языке имеются специальные символы разветвления и слияния потоков. 
Шаги последовательно располагаются вертикально сверху вниз. На каждом шаге выполняется определенный перечень действий (операций). 
После того, как шаг выполнен, управление передается следующему за ним шагу. Переход между шагами может быть условным или безусловным. Условный переход требует выполнение определенного логического условия для передачи управления на следующий шаг; пока это условие не выполнено программа будет оставаться внутри текущего шага, даже если все операции внутри шага уже выполнены. Безусловный переход происходит всегда после полного выполнения всех операций на данном шаге. С помощью переходов можно осуществлять разделение и слияние ветвей последовательности, организовать параллельную обработку нескольких ветвей или заставить одну выполненную ветвь ждать завершения другой.                    


 Дополнение:
 ----------------
 
Последние версии позволяют писать рецепты  с несколькими операциями одновременно.
Обозначение таких операции указывается между знаками // (слэш)

1). /Опер1/Управление по субстрату
'Анализ
$motor=0
trans 2 if $feed[] <35
-------------------------
2). Подпитка 1 мин
$motor=10
trans 1 if $timer>60
--------------------

' Управляем ph
11). /ph/
%base=0
trans 12 if $ph[] <6
------------------
12).
$R1=$age+60
%base=100
trans 11 if $age >= $R1
-------------------

'управляем DO
'если DO падает, то ставим на 500
'потом снижаем каждую минуту в 2 раза 
20). /do/
%stir=0
trans 25
----------------------
21).
trans 22 if $do[0]+1 <= $do[-1]
trans 23 if $do [0] > $do[-1] + 1
-----------------
22).
%stir=500
trans 25
-----------------
23).
%stir=$stir[]/2
trans 25
------------------
25). пауза
$R3=$age
stop
trans 21 if $age>=$R3
--------------------

 
$timer  $retro действуют только ДЛЯ  ПЕРВОЙ  ОПЕРАЦИИ. На помощь приходит $age.
Как делать паузу  в дополнительных операциях было показано выше, а именно:                    
12).
$R1=$age+60
%base=100
trans 11 if $age >= $R1
-------------------

В целях упрощения работы с программой конечных пользователей был предложен вариант 
с 'параметрами'. В рецепте теперь можно использовать данные, указанные в параметрах.
А в поля информации можно записывать ход ферментации. Также можно записывать в протокол. 
Обращение к этим подпрограммам следующее:
                       
user(откуда);
$R0=write2infos(куда,что);
$R0=write2log(что);
$R0=write2tablo(что);      

Так выглядит рецепт с параметрами:

 'Рецепт EXPO по PH_DO v2.

0). /oпер_01/
$R1=user(1) 'R1 - текущий % насоса
trans 22 if user(5)>user(6) 'A д.б. < Б
trans 1
----------------------------
1).  ' накачка 
$motor=$R1
$R0=write2infos(0,"Накачка._См. таймер")
$R0=write2tablo("Накачка."&Chr(32)&"См. таймер")
$R0=write2infos(1,$R1)
trans 2 if $timer>user(0)*60 
-----------------------------
2).   ' Анализ 0-А
$motor=0
$R0=write2infos(0,"Анализ_0-А._См. таймер")
$R0=write2tablo("Анализ_0-А._См. таймер")

trans 12 if $ph[]>=user(3) AND $do[]>=user(4)' ждем изменения ph и do
trans 3 if $timer>user(5)*60 
-----------------------------

3).   ' Анализ А-Б
$R0=write2infos(0,"Анализ_А-Б._См. таймер")
$R0=write2tablo("Анализ_А-Б._См. таймер")
trans 1 if $ph[]>=user(3) AND $do[]>=user(4)' ждем изменения ph и do
trans 4 if $timer>(user(6)-user(5))*60
-----------------------------

4).   ' Анализ Б-беск.
$R0=write2infos(0,"Анализ_Б-..._См. таймер")
$R0=write2tablo("Анализ_Б-..._См. таймер")
trans 14 if $ph[]>=user(3)AND $do[]>=user(4)' ждем изменения ph и do
-----------------------------

12). 'Увеличение скорости
$R1=$R1*user(2)
trans 1
------------------------------
14). 'Уменьшение скорости
$R1=$R1/user(2)
trans 1
------------------------------
22).
$R0=write2infos(0,"Ошибка_точек_времени: A>Б")
$R0=msgbox($top,"Ошибка","Ошибка_точек_времени: A>Б")
stop
--------------

99). 'фиктивная
$R0=write2infos(0,"Ожидание...")
stop
--------------

А так выглядит окно с параметрами на вкладке 'Параметры' SDK:

 

 

View24, SCADA c минимальными ресурсами

Этот сайт view24.org демонстрирует использование SCADA View24 для полива цветов. SCADA– это вещь хорошо изученная, еще до появления Интернета. Однако, с появлением Интернета,  появились новые возможности – дистанционное управление объектом, визуализация данных и облачное хранение и архивация данных. Использование понятия OPC – внесло некоторую путаницу в понятие SCADA. И этому способствовала такая одиозная организация как ‘Opc foundation’, хотя по сути OPC является лишь подсистемой SCADA. К счастью, с появлением стандарта websocket все стало на свои места. Появилась возможность общения устройств – объектов и зрителей между собой. На главные позиции выступает Панель Управления – dash-board (dashboard) . Нужно отдать должное ‘Opc foundation’, они сформулировали виды панелей. И на первое место выходит панель с независимой платформой  OPC – UA.  Поставим вопрос, а что в Интернете является независимой платформой? Естественно – браузеры. Поэтому и панели управления должны базироваться на браузерах. Именно такой панелью является View24. По сути дела – это сайт, общающийся с устройством посредством websocket сервера. Конечно, на ум приходит MQTT, но ведь MQTT  началась в IBM еще до создания WEBSOCKET в GOOGLE.  

 

И. наконец, еще одна особенность View24 – конфигурация переменных ( тегов ) задается в программе, управляющей объектом.