Вверх ↑
Ответов: 165
Рейтинг: 7
#1: 2019-04-26 12:54:39 ЛС | профиль | цитата
по просьбе трудящихся описание списка
цикл опроса асинхронный в отдельном потоке поэтому при старте Openxxx нужны готовые параметры
сети, которые он будет крутить бесконечно,складывая полученные данные в соответствующие массивы. Модули ReadMod,WriteMod общие для обоих типов обмена rs-485/tcp.
ReadMod читает нужный параметр просто из соответствующих массивов без остановки цикла обмена.
WriteMod передает запрос в соотв. структуру отложенной записи и уходит.Цикл чтения наткнувшись на флаг записи-прерывает чтение и переходит па п/п отработки записи,после отработки возвращается на цикличное чтение.

По Спискам.
-параметр определяется парой строк смещение/длина,причем если длина=0 то этот параметр отключен.Смещение введено для того чтоб не читать переменные которые не нужны
В одном списке обьявлены параметры 4х типов,охватывающие все типы данных по любым устройствам:

-переменные или параметры v,vb,vw,vd,real32 где v-бит vb-байт vw-слово vd,real32-двойное слово
-дискретные входы DI
-дискретные выходы DO
-аналоговые входы AIW
-------------------------------------------------------------------------------------
ну вот пример var.sha списка

//глобальный счетчик устройств(списков)
Count_slave=000001 (количество контроллеров для перебора в цикле опроса)
//1й список---------------------------------------
Slave_addr=000001 (адрес контроллера для первого списка)
//ограничитель кол-ва в одном запросе 0=все
Slave_limiter=000008 (ограничитель группирования запросов в одном пакете,начни с одного)
//переменные кодируются в словах (16бит)
Slave_addr_offset=000100 (смещение начала для переменных типа v(m),vw(mw),vd(md),real32)
Slave_addr_length=000004 (длина(кол-во) переменных(параметров) 0-выключено)
//входы\выходы кодируются в байтах, т.е. 8 входов= 1байт
Slave_di_offset=000000 (смещение дискретных входов)
Slave_di_length=000002 (длина(кол-во) дискретных входов 2=16входов, 0-выключено)
Slave_do_offset=000000 (смещение дискретных выходов)
Slave_do_length=000002 (длина(кол-во) дискретных выходов 2=16выходов, 0-выключено)
// аналоговые входы кодируются в словах (16 бит)
Slave_aiw_offset=000000 (смещение аналоговых входов)
Slave_aiw_length=000000 (длина(кол-во) аналоговых входов , 0-выключено)
Timeout_sl=000050 (макс время ожидания по этому списку если строки нет,используется таймаут максимальный из Open)
//2й список итд...
------------------------------
забыл добавочно для функций 7,17

Slave_status=000000 (чтение индикаторов устройства не все поддерживают 0-откл)
Slave_string=000000 (чтение идентификатора уст-ва не проверено 0-откл)
схема по 232/485
Add(MainForm,2953706,21,105)
{
Width=734
Height=417
Point(onShow)
}
Add(Message,123658,273,157)
{
Caption="ошибка"
}
Add(Timer,7017340,295,87)
{
Interval=100
Enable=1
Point(Enabled)
link(onTimer,11580707:doNext,[])
}
Add(Button,8763931,84,150)
{
Left=42
Top=67
Caption="стоп"
link(onClick,16171650:doClose,[(123,156)(123,121)])
}
Add(Label,4925358,470,59)
{
Left=138
Top=29
Alignment=2
}
Add(VisualStrings,12635098,700,7)
{
Lines=#23:-убрать верхние точки +|28:-вывести ошибку на onerror +|19: желательно строкой|28:- убрать свойство ordercrc +|35:- задействовать свойство orderdata+|40: -при чтении установка флага ошибки 8х +|45:-критическая секция по чтению и точка внизу +|28:- запись функций по маркеру+|45:-вход для записи нижняя точка с крит секцией+|30:-добавить точку debug,ondebug+|0
Width=256
Height=158
}
Add(Button,15947241,84,94)
{
Left=43
Top=27
Caption="пуск"
link(onClick,16171650:doOpen,[(165,100)(165,114)])
}
Add(CounterEx2,11580707,379,87)
{
Reverse=1
Point(doMin)
link(onNext,12232797:doEvent1,[])
}
Add(OpenMod2,16171650,175,108)
{
Port=2
StopBits=2
DTR=0
Point(doOpenDebug)
Point(doNextDebug)
link(onInit,7017340:doTimer,[(214,114)(214,93)])
link(onErr,123658:doMessage,[(240,121)(240,163)])
link(onClose,12767862:doEvent1,[(221,128)(221,100)])
link(Array,13238656:Array,[(185,60)])
}
Add(StrList,13238656,165,6)
{
Strings=#52://характеристики сети, кол-во контроллеров,параметры|25://наименование параметров|39://глобальный счетчик устройств(списков)|18:Count_slave=000001|50://1й список---------------------------------------|17:Slave_addr=000001|44://ограничитель кол-ва в одном запросе 0=все|20:Slave_limiter=000008|32://переменные кодируются в словах|24:Slave_addr_offset=000100|24:Slave_addr_length=000004|56://входы\выходы кодируются в байтах, т.е. 8 входов= 1байт|22:Slave_di_offset=000000|22:Slave_di_length=000002|22:Slave_do_offset=000000|22:Slave_do_length=000002|23:Slave_aiw_offset=000000|23:Slave_aiw_length=000000|18://2й список итд...|000
}
Add(Hub,12767862,247,94)
{
link(onEvent1,7017340:doStop,[])
link(onEvent2,11580707:doMin,[(284,107)(284,131)(346,131)(346,100)])
}
Add(Button,7260898,494,167)
{
Left=79
Top=145
Caption="писать"
Data=Integer(1)
link(onClick,6738729:doEvent1,[])
}
Add(Hub,15727507,77,301)
{
OutCount=8
link(onEvent1,4818046:doRead,[(102,307)(102,300)])
link(onEvent2,1231721:doRead,[(277,314)(277,370)])
link(onEvent3,7461444:doRead,[(270,321)(270,433)])
link(onEvent4,7573981:doRead,[(179,328)(179,496)])
link(onEvent5,13563447:doRead,[(172,335)(172,572)])
}
Add(WriteMod2,5405032,714,210)
{
Nbit=7
Slave=1
Point(doType)
Point(doAddress)
link(Data,11637820:Var3,[(720,152)])
link(Var,5438751:Text,[(727,201)(790,201)(790,215)(804,215)])
}
Add(Hub,12232797,420,84)
{
link(onEvent1,4925358:doText,[(452,90)(452,65)])
link(onEvent2,15727507:doEvent1,[(445,97)(445,209)(67,209)(67,307)])
}
Add(Label,53433,601,8)
{
Left=139
Top=169
Width=89
Height=17
Caption="данные записи"
Alignment=2
}
Add(DoData,3725637,638,224)
{
link(onEventData,5405032:doType,[(683,230)(683,223)])
link(Data,8530664:String,[(644,110)(664,110)])
}
Add(Hub,6738729,567,168)
{
OutCount=4
link(onEvent2,14795064:doData,[(592,181)(592,335)])
link(onEvent3,5405032:doWrite,[(704,188)(704,216)])
}
Add(Label,5910856,548,6)
{
Left=82
Top=169
Width=44
Height=17
Caption="адрес"
Alignment=2
}
Add(Label,9906240,652,9)
{
Left=238
Top=169
Width=60
Height=17
Caption="тип записи"
Alignment=2
}
Add(ComboBox,8530664,651,56)
{
Left=247
Top=194
Height=21
Strings=#1:0|1:1|1:2|1:3|1:4|
Text="тип переменной"
link(onClick,3725637:doData,[(690,69)(690,48)(627,48)(627,230)])
}
Add(Edit,358232,637,273)
{
Left=81
Top=192
Text="0"
}
Add(DoData,14795064,637,329)
{
link(onEventData,237120:doEvent1,[])
link(Data,358232:Text,[])
}
Add(Edit,5438751,798,175)
{
Left=143
Top=193
Width=82
Text="857870592"
}
Add(Label,13118771,190,240)
{
Left=375
Top=152
Width=140
Height=17
Caption="чтение разных типов"
Alignment=2
}
Add(ReadMod2,4818046,287,294)
{
Slave=1
Address=101
Point(doAddress)
link(onRead,14106347:doText,[])
link(Data,13468401:Var1,[(293,215)])
}
Add(ReadMod2,1231721,287,364)
{
Type=1
Slave=1
Address=101
Point(doAddress)
link(onRead,7390483:doText,[])
link(Data,4246543:Var1,[(293,334)])
}
Add(ReadMod2,7461444,287,427)
{
Type=2
Slave=1
Address=100
Point(doAddress)
link(onRead,10520124:doText,[(375,433)(375,437)])
link(Data,15705995:Var1,[(293,404)])
}
Add(ReadMod2,7573981,287,490)
{
Type=3
Slave=1
Address=100
Point(doAddress)
link(onRead,5998591:doText,[(375,496)(375,501)])
link(Data,222502:Var2,[(293,467)(482,467)])
}
Add(Button,1938151,18,167)
{
Left=231
Top=26
Width=76
Caption="старт debug"
Data=Integer(1)
link(onClick,16171650:doOpenDebug,[(60,173)(60,128)])
}
Add(Button,3906177,19,226)
{
Left=231
Top=67
Width=76
Caption="next debug"
Data=Integer(1)
link(onClick,16171650:doNextDebug,[(130,232)(130,135)])
}
Add(Edit,14106347,375,294)
{
Left=398
Top=194
Width=102
Text="0"
DataType=3
}
Add(Edit,7390483,379,364)
{
Left=398
Top=232
Width=102
Text="0"
DataType=3
}
Add(Edit,10520124,383,431)
{
Left=398
Top=271
Width=102
Text="0"
DataType=3
}
Add(Edit,5998591,380,495)
{
Left=398
Top=311
Width=102
Text="0"
DataType=3
}
Add(Hub,237120,682,329)
{
link(onEvent1,5405032:doAddress,[(702,335)(702,230)])
}
Add(Hub,4140236,193,356)
{
OutCount=5
link(onEvent1,4818046:doAddress,[(214,362)(214,307)])
link(onEvent2,1231721:doAddress,[(256,369)(256,377)])
link(onEvent3,7461444:doAddress,[(249,376)(249,440)])
link(onEvent4,7573981:doAddress,[(242,383)(242,503)])
}
Add(GetDataEx,11637820,476,147)
{
Angle=3
link(Data,16171650:VarX,[(181,152)])
}
Add(GetDataEx,13468401,476,210)
{
link(Data,11637820:Var2,[])
}
Add(GetDataEx,4246543,476,329)
{
link(Data,13468401:Var2,[])
}
Add(GetDataEx,15705995,476,399)
{
link(Data,4246543:Var2,[])
}
Add(Button,15804590,77,466)
{
Left=74
Top=318
Width=76
Caption="читать"
Data=Integer(1)
}
Add(Label,11359703,433,295)
{
Left=324
Top=196
Width=60
Height=17
Caption="bit"
Alignment=2
}
Add(Label,8356358,436,363)
{
Left=324
Top=234
Width=60
Height=17
Caption="byte"
Alignment=2
}
Add(Label,6359732,435,429)
{
Left=325
Top=273
Width=60
Height=17
Caption="word"
Alignment=2
}
Add(Label,5972207,433,491)
{
Left=325
Top=313
Width=60
Height=17
Caption="dword"
Alignment=2
}
Add(ReadMod2,13563447,287,566)
{
Type=4
Slave=1
Address=104
Point(doAddress)
link(onRead,11775827:doText,[])
link(Data,222502:Var1,[(293,544)(475,544)(475,460)])
}
Add(Edit,11775827,377,567)
{
Left=398
Top=347
Width=102
Text="0"
DataType=4
}
Add(Label,8906340,436,566)
{
Left=332
Top=347
Width=33
Height=17
Caption="real32"
Alignment=2
}
Add(GetDataEx,222502,476,455)
{
link(Data,15705995:Var2,[])
}
карма: 1

0
Редактировалось 4 раз(а), последний 2019-04-26 13:49:36