<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Last forum posts : Отслеживание ошибок</title>
		<link>http://oscada.org/en/forum/topics/otslezhivanie_oshibok/</link>
		<description>Отслеживание ошибок</description>
		<language>en</language>
		<lastbuilddate>Wed, 15 Apr 2026 05:07:20 +0300</lastbuilddate>
		<generator>mm_forum powered by TYPO3</generator>
		<ttl>60</ttl>
		
		
		<item>
			<title>LTS 0.9.x Некорректная работа Serial с собственным протоколом</title>
			<link>http://oscada.org/en/forum/posts///10269/</link>
			<pubDate>Tue, 02 May 2023 20:26:40 +0300</pubDate>
			<description> Что не ошибка, тем более для LTS, поскольку этот протокол не предназначен для работы через Serial, а соответственно не имеет механизмов контроля целостности и ожидает как минимум прихода заголовка целиком, чего Serial не гарантирует!   Сейчас Собственный Протокол отдельно ожидает заголовок, а потом весь ответ и корректно обрабатывает попытки и ошибки. Ну и фрагментация чуть ли не по байтам для него не проблема, т.е. работает с Serial, что однако не снимает проблемы проверки целосности если этот Serial — реальная физическая шина с потенциальным искажением трафика.  Исправлено!</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;roman&quot; wrote:<br /><br />
Что не ошибка, тем более для LTS, поскольку этот протокол не предназначен для работы через Serial, а соответственно не имеет механизмов контроля целостности и ожидает как минимум прихода заголовка целиком, чего Serial не гарантирует!<br />
</div><br />
<br />
Сейчас Собственный Протокол отдельно ожидает заголовок, а потом весь ответ и корректно обрабатывает попытки и ошибки.<br />
Ну и фрагментация чуть ли не по байтам для него не проблема, т.е. работает с Serial, что однако не снимает проблемы проверки целосности если этот Serial — реальная физическая шина с потенциальным искажением трафика.<br />
<br />
Исправлено!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>Дедлоки в модулях VCAEngine, UserProtocol, WebUser</title>
			<link>http://oscada.org/en/forum/posts///10268/</link>
			<pubDate>Tue, 02 May 2023 06:29:55 +0300</pubDate>
			<description>Реально только здесь, что было добавлено для Android где нет __GLIBC_PREREQ:  #ifndef __GLIBC_PREREQ # define __GLIBC_PREREQ(maj, min) 1 #endif</description>
			<content:encoded><![CDATA[      Реально только здесь, что было добавлено для Android где нет __GLIBC_PREREQ:<br />
<br />
<div class="tx-mmforum-pi1-pt-quote">#ifndef __GLIBC_PREREQ<br />
# define __GLIBC_PREREQ(maj, min) 1<br />
#endif</div>      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>Дедлоки в модулях VCAEngine, UserProtocol, WebUser</title>
			<link>http://oscada.org/en/forum/posts///10266/</link>
			<pubDate>Mon, 01 May 2023 23:32:19 +0300</pubDate>
			<description>Да, как и предполагал все идеально работает. Так что решение у Вас уже было.  Патч простой. Вызов тривиального sed для файлов resalloc., которые добавляют еще одно условие препроцессора.   $ sed '/^#if !__GLIBC_PREREQ(2,4)$/ s/$/ || __MUSL__/'  resalloc.h $ sed '/^#if !__GLIBC_PREREQ(2,4)$/ s/$/ || __MUSL__/'  resalloc.cpp   Да, musl не определяет этот макрос, поэтому при сборке необходимо указать в опциях компиляции -D__MUSL__. Если посчитаете нужным - добавьте в следующий релиз. Можно будет собирать под musl.  P.S.: Собираю образы Docker на основе Alpine Linux, использующего musl. Получается очень компактно и шустро. Упакованный образ занимает всего 13Мб без модулей использующих Qt. Развертывание на сервере за пару секунд.</description>
			<content:encoded><![CDATA[      Да, как и предполагал все идеально работает. Так что решение у Вас уже было.<br />
<br />
Патч простой. Вызов тривиального sed для файлов resalloc.[h,cpp], которые добавляют еще одно условие препроцессора.<br />
<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">$ sed '/^#if !__GLIBC_PREREQ(2,4)$/ s/$/ || __MUSL__/'  resalloc.h
$ sed '/^#if !__GLIBC_PREREQ(2,4)$/ s/$/ || __MUSL__/'  resalloc.cpp</pre></div><br />
<br />
Да, musl не определяет этот макрос, поэтому при сборке необходимо указать в опциях компиляции -D__MUSL__.<br />
Если посчитаете нужным - добавьте в следующий релиз. Можно будет собирать под musl.<br />
<br />
P.S.: <a href="https://github.com/dudanov/docker-openscada" target="_blank" class="link_10">Собираю образы Docker</a> на основе Alpine Linux, использующего musl. Получается очень компактно и шустро. Упакованный образ занимает всего 13Мб без модулей использующих Qt. Развертывание на сервере за пару секунд.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>dudanov</dc:creator>
		</item>
		
		<item>
			<title>Дедлоки в модулях VCAEngine, UserProtocol, WebUser</title>
			<link>http://oscada.org/en/forum/posts///10264/</link>
			<pubDate>Mon, 01 May 2023 22:25:49 +0300</pubDate>
			<description>Смотрю resalloc.cpp. Похоже, что код уже адаптирован. Просто к условиям #if !__GLIBC_PREREQ(2,4) можно добавить || __MUSL__.  Получится так для примера.  #if !__GLIBC_PREREQ(2,4) || __MUSL__     wThr = 0; #endif   Попробую. При удачных тестах пришлю патч в эту тему на Ваше рассмотрение. Заранее благодарю, Роман.</description>
			<content:encoded><![CDATA[      Смотрю resalloc.cpp. Похоже, что код уже адаптирован. Просто к условиям <strong>#if !__GLIBC_PREREQ(2,4)</strong> можно добавить <strong>|| __MUSL__</strong>.<br />
<br />
Получится так для примера.<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">#if !__GLIBC_PREREQ(2,4) || __MUSL__
    wThr = 0;
#endif</pre></div><br />
<br />
Попробую. При удачных тестах пришлю патч в эту тему на Ваше рассмотрение.<br />
Заранее благодарю, Роман.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>dudanov</dc:creator>
		</item>
		
		<item>
			<title>Дедлоки в модулях VCAEngine, UserProtocol, WebUser</title>
			<link>http://oscada.org/en/forum/posts///10263/</link>
			<pubDate>Mon, 01 May 2023 21:32:12 +0300</pubDate>
			<description>Не ошибка, если учесть, что класс ResRW расширен для обработки таких блокировок ввиду сложности их отслеживания и которые иногда неминучи, как в случає с рекурсивными мютексами.  Данные-ж действительно можно обойти, но думаю они далеко не все!  Адаптируйте ResRW под этот LibC — http://oscada.org/svn/trunk/OpenSCADA/src/resalloc.h</description>
			<content:encoded><![CDATA[      Не ошибка, если учесть, что класс ResRW расширен для обработки таких блокировок ввиду сложности их отслеживания и которые иногда неминучи, как в случає с рекурсивными мютексами.<br />
<br />
Данные-ж действительно можно обойти, но думаю они далеко не все!<br />
<br />
Адаптируйте ResRW под этот LibC — <a href="http://oscada.org/svn/trunk/OpenSCADA/src/resalloc.h" target="_blank" class="link_10">http://oscada.org/svn/trunk/OpenSCADA/src/resalloc.h</a>      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>Дедлоки в модулях VCAEngine, UserProtocol, WebUser</title>
			<link>http://oscada.org/en/forum/posts///10262/</link>
			<pubDate>Mon, 01 May 2023 21:01:08 +0300</pubDate>
			<description>Здравствуйте, Роман.  Снова выявились проблемы благодаря сборке системы под musl. На сей раз дедлоки в модулях VCAEngine, UserProtocol, WebUser. В крайних 2-х модулях дедлок возникал при загрузке системы, в первом - при обращении к библиотечному шаблону проекта tmplSO. Общая для всех случаев ситуация: один поток сначала захватывает мьютекс на запись (эксклюзивно), потом пытается захватить на чтение, владея правами на запись. Стандартом POSIX разрешается для rwlock многократный захват на чтение при условии эквивалентного количества освобождения, но явно запрещается потоку-владельцу на запись вызов захвата на чтение, поведение после вызова неопределено.  Ниже приведу стек вызовов всех 3-х случаев.  VCAEngine: Вызов stlPropSet производит захват на запись, а вызов stlSize следом пытается получить права на чтение, что приводит к дедлоку:  Thread 6 (LWP 50): #0  __syscall_cp_c (nr=202, u=139988244794992, v=128, w=-1, x=0, y=0, z=0) at ./arch/x86_64/syscall_arch.h:61 #1  0x00007f51904b1ba9 in __futex4_cp (to=0x0, val=-1, op=128, addr=0x7f518d9a8e70) at src/thread/__timedwait.c:24 #2  __timedwait_cp (addr=addr@entry=0x7f518d9a8e70, val=val@entry=-1, clk=clk@entry=0, at=at@entry=0x0, priv=priv@entry=128) at src/thread/__timedwait.c:52 #3  0x00007f51904b1c4e in __timedwait (addr=addr@entry=0x7f518d9a8e70, val=-1, clk=clk@entry=0, at=at@entry=0x0, priv=128) at src/thread/__timedwait.c:68 #4  0x00007f51904b440c in __pthread_rwlock_timedrdlock (at=&lt;optimized out&gt;, rw=&lt;optimized out&gt;) at src/thread/pthread_rwlock_timedrdlock.c:18 #5  __pthread_rwlock_timedrdlock (rw=0x7f518d9a8e70, at=0x0) at src/thread/pthread_rwlock_timedrdlock.c:3 #6  0x00007f51900ce9c4 in OSCADA::ResRW::resRequestR (this=0x7f518d9a8e70, tm=0) at resalloc.cpp:86 #7  0x00007f51900cef94 in OSCADA::ResAlloc::request (this=0x7f518d806040, write=false, tm=0) at resalloc.cpp:132 #8  0x00007f51900ceefc in OSCADA::ResAlloc::ResAlloc (this=0x7f518d806040, rid=..., write=false, tm=0) at resalloc.cpp:122 #9  0x00007f518f1a8b57 in VCA::Project::stlSize (this=0x7f518d9a8d20) at project.cpp:456 #10 0x00007f518f1a9585 in VCA::Project::stlPropSet (this=0x7f518d9a8d20, pid=..., vl=..., sid=0) at project.cpp:521 #11 0x00007f518f1c431b in VCA::Page::stlReq (this=0x7f518c6d9d50, a=..., vl=..., wr=true) at project.cpp:1566 #12 0x00007f518f1376e2 in VCA::Widget::stlReq (this=0x7f518bdd5bb0, a=..., vl=..., wr=true) at widget.cpp:858 #13 0x00007f518f159026 in VCA::Attr::setS (this=0x7f518bcc2d70, val=..., strongPrev=true, sys=false) at widget.cpp:1943 ... #41 0x00007f51904b308b in start (p=0x7f518d80cad8) at src/thread/pthread_create.c:203 #42 0x00007f51904b538e in __clone () at src/thread/x86_64/clone.s:22   UserProtocol: Вызов setEnable производит захват на запись, а вызов loadIO следом пытается получить права на чтение, что приводит к дедлоку:  Thread 1 (LWP 7): #0  __syscall_cp_c (nr=202, u=139988254130728, v=128, w=-1, x=0, y=0, z=0) at ./arch/x86_64/syscall_arch.h:61 #1  0x00007f51904b1ba9 in __futex4_cp (to=0x0, val=-1, op=128, addr=0x7f518e290228) at src/thread/__timedwait.c:24 #2  __timedwait_cp (addr=addr@entry=0x7f518e290228, val=val@entry=-1, clk=clk@entry=0, at=at@entry=0x0, priv=priv@entry=128) at src/thread/__timedwait.c:52 #3  0x00007f51904b1c4e in __timedwait (addr=addr@entry=0x7f518e290228, val=-1, clk=clk@entry=0, at=at@entry=0x0, priv=128) at src/thread/__timedwait.c:68 #4  0x00007f51904b440c in __pthread_rwlock_timedrdlock (at=&lt;optimized out&gt;, rw=&lt;optimized out&gt;) at src/thread/pthread_rwlock_timedrdlock.c:18 #5  __pthread_rwlock_timedrdlock (rw=0x7f518e290228, at=0x0) at src/thread/pthread_rwlock_timedrdlock.c:3 #6  0x00007f51900ce9c4 in OSCADA::ResRW::resRequestR (this=0x7f518e290228, tm=0) at resalloc.cpp:86 #7  0x00007f51900cef94 in OSCADA::ResAlloc::request (this=0x7ffd797a7a60, write=false, tm=0) at resalloc.cpp:132 #8  0x00007f51900ceefc in OSCADA::ResAlloc::ResAlloc (this=0x7ffd797a7a60, rid=..., write=false, tm=0) at resalloc.cpp:122 #9  0x00007f518ebc4101 in UserProtocol::UserPrt::loadIO (this=0x7f518e28ff60) at user_prt.cpp:463 #10 0x00007f518ebc766e in UserProtocol::UserPrt::setEnable (this=0x7f518e28ff60, vl=true) at user_prt.cpp:602 #11 0x00007f518ebbeecd in UserProtocol::TProt::modStart (this=0x7f518f29e9b0) at user_prt.cpp:162 #12 0x00007f5190206733 in OSCADA::TSubSYS::subStart (this=0x7f518f29fb10) at tsubsys.cpp:120 #13 0x00007f51900858be in OSCADA::TSYS::start (this=0x7f51904f70c0) at tsys.cpp:912 #14 0x000055d8151669b6 in main (argc=5, argv=0x7ffd797a82f8, envp=0x7ffd797a8328) at main.cpp:90   WebUser: Вызов setEnable производит захват на запись, а вызов loadIO следом пытается получить права на чтение, что приводит к дедлоку:  Thread 1 (LWP 7): #0  __syscall_cp_c (nr=202, u=140208415574280, v=128, w=-1, x=0, y=0, z=0) at ./arch/x86_64/syscall_arch.h:61 #1  0x00007f84d2edeba9 in __futex4_cp (to=0x0, val=-1, op=128, addr=0x7f84d0ce0908) at src/thread/__timedwait.c:24 #2  __timedwait_cp (addr=addr@entry=0x7f84d0ce0908, val=val@entry=-1, clk=clk@entry=0, at=at@entry=0x0, priv=priv@entry=128) at src/thread/__timedwait.c:52 #3  0x00007f84d2edec4e in __timedwait (addr=addr@entry=0x7f84d0ce0908, val=-1, clk=clk@entry=0, at=at@entry=0x0, priv=128) at src/thread/__timedwait.c:68 #4  0x00007f84d2ee140c in __pthread_rwlock_timedrdlock (at=&lt;optimized out&gt;, rw=&lt;optimized out&gt;) at src/thread/pthread_rwlock_timedrdlock.c:18 #5  __pthread_rwlock_timedrdlock (rw=0x7f84d0ce0908, at=0x0) at src/thread/pthread_rwlock_timedrdlock.c:3 #6  0x00007f84d2afb9c4 in OSCADA::ResRW::resRequestR (this=0x7f84d0ce0908, tm=0) at resalloc.cpp:86 #7  0x00007f84d2afbf94 in OSCADA::ResAlloc::request (this=0x7fffc5ec59b0, write=false, tm=0) at resalloc.cpp:132 #8  0x00007f84d2afbefc in OSCADA::ResAlloc::ResAlloc (this=0x7fffc5ec59b0, rid=..., write=false, tm=0) at resalloc.cpp:122 #9  0x00007f84d1552f07 in WebUser::UserPg::loadIO (this=0x7f84d0ce0650) at web_user.cpp:551 #10 0x00007f84d1556daa in WebUser::UserPg::setEnable (this=0x7f84d0ce0650, vl=true) at web_user.cpp:677 #11 0x00007f84d154a079 in WebUser::TWEB::modStart (this=0x7f84d1520040) at web_user.cpp:159 #12 0x00007f84d2c33733 in OSCADA::TSubSYS::subStart (this=0x7f84d1cc19e0) at tsubsys.cpp:120 #13 0x00007f84d2ab28be in OSCADA::TSYS::start (this=0x7f84d2f240c0) at tsys.cpp:912 #14 0x0000564c086bc9b6 in main (argc=5, argv=0x7fffc5ec6278, envp=0x7fffc5ec62a8) at main.cpp:90   Я исправил это, пересобрал систему и все отлично работает, дедлоков нет. Не загрузил свой патч по той причине, что не уверен верно ли сделал, так как еще не разбирался в тонкостях работы сущностей и реализации, сделал как было очевидно на первый взгляд.  Заранее благодарю.</description>
			<content:encoded><![CDATA[      Здравствуйте, Роман.<br />
<br />
Снова выявились проблемы благодаря сборке системы под musl. На сей раз дедлоки в модулях <strong>VCAEngine</strong>, <strong>UserProtocol</strong>, <strong>WebUser</strong>. В крайних 2-х модулях дедлок возникал при загрузке системы, в первом - при обращении к библиотечному шаблону проекта <strong>tmplSO</strong>. Общая для всех случаев ситуация: один поток сначала захватывает мьютекс на запись (эксклюзивно), потом пытается захватить на чтение, владея правами на запись. Стандартом POSIX разрешается для rwlock многократный захват на чтение при условии эквивалентного количества освобождения, но явно запрещается потоку-владельцу на запись вызов захвата на чтение, поведение после вызова неопределено.<br />
<br />
Ниже приведу стек вызовов всех 3-х случаев.<br />
<br />
<strong>VCAEngine</strong>: Вызов <u>stlPropSet</u> производит захват на запись, а вызов <u>stlSize</u> следом пытается получить права на чтение, что приводит к дедлоку:<br />
<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">Thread 6 (LWP 50):
#0  __syscall_cp_c (nr=202, u=139988244794992, v=128, w=-1, x=0, y=0, z=0) at ./arch/x86_64/syscall_arch.h:61
#1  0x00007f51904b1ba9 in __futex4_cp (to=0x0, val=-1, op=128, addr=0x7f518d9a8e70) at src/thread/__timedwait.c:24
#2  __timedwait_cp (addr=addr@entry=0x7f518d9a8e70, val=val@entry=-1, clk=clk@entry=0, at=at@entry=0x0, priv=priv@entry=128) at src/thread/__timedwait.c:52
#3  0x00007f51904b1c4e in __timedwait (addr=addr@entry=0x7f518d9a8e70, val=-1, clk=clk@entry=0, at=at@entry=0x0, priv=128) at src/thread/__timedwait.c:68
#4  0x00007f51904b440c in __pthread_rwlock_timedrdlock (at=&lt;optimized out&gt;, rw=&lt;optimized out&gt;) at src/thread/pthread_rwlock_timedrdlock.c:18
#5  __pthread_rwlock_timedrdlock (rw=0x7f518d9a8e70, at=0x0) at src/thread/pthread_rwlock_timedrdlock.c:3
#6  0x00007f51900ce9c4 in OSCADA::ResRW::resRequestR (this=0x7f518d9a8e70, tm=0) at resalloc.cpp:86
#7  0x00007f51900cef94 in OSCADA::ResAlloc::request (this=0x7f518d806040, write=false, tm=0) at resalloc.cpp:132
#8  0x00007f51900ceefc in OSCADA::ResAlloc::ResAlloc (this=0x7f518d806040, rid=..., write=false, tm=0) at resalloc.cpp:122
#9  0x00007f518f1a8b57 in VCA::Project::stlSize (this=0x7f518d9a8d20) at project.cpp:456
#10 0x00007f518f1a9585 in VCA::Project::stlPropSet (this=0x7f518d9a8d20, pid=..., vl=..., sid=0) at project.cpp:521
#11 0x00007f518f1c431b in VCA::Page::stlReq (this=0x7f518c6d9d50, a=..., vl=..., wr=true) at project.cpp:1566
#12 0x00007f518f1376e2 in VCA::Widget::stlReq (this=0x7f518bdd5bb0, a=..., vl=..., wr=true) at widget.cpp:858
#13 0x00007f518f159026 in VCA::Attr::setS (this=0x7f518bcc2d70, val=..., strongPrev=true, sys=false) at widget.cpp:1943
...
#41 0x00007f51904b308b in start (p=0x7f518d80cad8) at src/thread/pthread_create.c:203
#42 0x00007f51904b538e in __clone () at src/thread/x86_64/clone.s:22</pre></div><br />
<br />
<strong>UserProtocol</strong>: Вызов <u>setEnable</u> производит захват на запись, а вызов <u>loadIO</u> следом пытается получить права на чтение, что приводит к дедлоку:<br />
<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">Thread 1 (LWP 7):
#0  __syscall_cp_c (nr=202, u=139988254130728, v=128, w=-1, x=0, y=0, z=0) at ./arch/x86_64/syscall_arch.h:61
#1  0x00007f51904b1ba9 in __futex4_cp (to=0x0, val=-1, op=128, addr=0x7f518e290228) at src/thread/__timedwait.c:24
#2  __timedwait_cp (addr=addr@entry=0x7f518e290228, val=val@entry=-1, clk=clk@entry=0, at=at@entry=0x0, priv=priv@entry=128) at src/thread/__timedwait.c:52
#3  0x00007f51904b1c4e in __timedwait (addr=addr@entry=0x7f518e290228, val=-1, clk=clk@entry=0, at=at@entry=0x0, priv=128) at src/thread/__timedwait.c:68
#4  0x00007f51904b440c in __pthread_rwlock_timedrdlock (at=&lt;optimized out&gt;, rw=&lt;optimized out&gt;) at src/thread/pthread_rwlock_timedrdlock.c:18
#5  __pthread_rwlock_timedrdlock (rw=0x7f518e290228, at=0x0) at src/thread/pthread_rwlock_timedrdlock.c:3
#6  0x00007f51900ce9c4 in OSCADA::ResRW::resRequestR (this=0x7f518e290228, tm=0) at resalloc.cpp:86
#7  0x00007f51900cef94 in OSCADA::ResAlloc::request (this=0x7ffd797a7a60, write=false, tm=0) at resalloc.cpp:132
#8  0x00007f51900ceefc in OSCADA::ResAlloc::ResAlloc (this=0x7ffd797a7a60, rid=..., write=false, tm=0) at resalloc.cpp:122
#9  0x00007f518ebc4101 in UserProtocol::UserPrt::loadIO (this=0x7f518e28ff60) at user_prt.cpp:463
#10 0x00007f518ebc766e in UserProtocol::UserPrt::setEnable (this=0x7f518e28ff60, vl=true) at user_prt.cpp:602
#11 0x00007f518ebbeecd in UserProtocol::TProt::modStart (this=0x7f518f29e9b0) at user_prt.cpp:162
#12 0x00007f5190206733 in OSCADA::TSubSYS::subStart (this=0x7f518f29fb10) at tsubsys.cpp:120
#13 0x00007f51900858be in OSCADA::TSYS::start (this=0x7f51904f70c0) at tsys.cpp:912
#14 0x000055d8151669b6 in main (argc=5, argv=0x7ffd797a82f8, envp=0x7ffd797a8328) at main.cpp:90</pre></div><br />
<br />
<strong>WebUser</strong>: Вызов <u>setEnable</u> производит захват на запись, а вызов <u>loadIO</u> следом пытается получить права на чтение, что приводит к дедлоку:<br />
<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">Thread 1 (LWP 7):
#0  __syscall_cp_c (nr=202, u=140208415574280, v=128, w=-1, x=0, y=0, z=0) at ./arch/x86_64/syscall_arch.h:61
#1  0x00007f84d2edeba9 in __futex4_cp (to=0x0, val=-1, op=128, addr=0x7f84d0ce0908) at src/thread/__timedwait.c:24
#2  __timedwait_cp (addr=addr@entry=0x7f84d0ce0908, val=val@entry=-1, clk=clk@entry=0, at=at@entry=0x0, priv=priv@entry=128) at src/thread/__timedwait.c:52
#3  0x00007f84d2edec4e in __timedwait (addr=addr@entry=0x7f84d0ce0908, val=-1, clk=clk@entry=0, at=at@entry=0x0, priv=128) at src/thread/__timedwait.c:68
#4  0x00007f84d2ee140c in __pthread_rwlock_timedrdlock (at=&lt;optimized out&gt;, rw=&lt;optimized out&gt;) at src/thread/pthread_rwlock_timedrdlock.c:18
#5  __pthread_rwlock_timedrdlock (rw=0x7f84d0ce0908, at=0x0) at src/thread/pthread_rwlock_timedrdlock.c:3
#6  0x00007f84d2afb9c4 in OSCADA::ResRW::resRequestR (this=0x7f84d0ce0908, tm=0) at resalloc.cpp:86
#7  0x00007f84d2afbf94 in OSCADA::ResAlloc::request (this=0x7fffc5ec59b0, write=false, tm=0) at resalloc.cpp:132
#8  0x00007f84d2afbefc in OSCADA::ResAlloc::ResAlloc (this=0x7fffc5ec59b0, rid=..., write=false, tm=0) at resalloc.cpp:122
#9  0x00007f84d1552f07 in WebUser::UserPg::loadIO (this=0x7f84d0ce0650) at web_user.cpp:551
#10 0x00007f84d1556daa in WebUser::UserPg::setEnable (this=0x7f84d0ce0650, vl=true) at web_user.cpp:677
#11 0x00007f84d154a079 in WebUser::TWEB::modStart (this=0x7f84d1520040) at web_user.cpp:159
#12 0x00007f84d2c33733 in OSCADA::TSubSYS::subStart (this=0x7f84d1cc19e0) at tsubsys.cpp:120
#13 0x00007f84d2ab28be in OSCADA::TSYS::start (this=0x7f84d2f240c0) at tsys.cpp:912
#14 0x0000564c086bc9b6 in main (argc=5, argv=0x7fffc5ec6278, envp=0x7fffc5ec62a8) at main.cpp:90</pre></div><br />
<br />
Я исправил это, пересобрал систему и все отлично работает, дедлоков нет.<br />
Не загрузил свой патч по той причине, что не уверен верно ли сделал, так как еще не разбирался в тонкостях работы сущностей и реализации, сделал как было очевидно на первый взгляд.<br />
<br />
Заранее благодарю.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>dudanov</dc:creator>
		</item>
		
		<item>
			<title>FSArch. Segfault с null при вызове closedir()</title>
			<link>http://oscada.org/en/forum/posts///10261/</link>
			<pubDate>Fri, 28 Apr 2023 10:31:42 +0300</pubDate>
			<description>Здравствуйте, Роман.  При сборке системы под musl вместо glibc вскрылась ошибка в модуле FSArch, которая заключается в виде вызова closedir() с NULL при отсутствии каталога архива.  Thread 1 (LWP 39): #0  0x00007ff0e135b38e in closedir (dir=0x0) at src/dirent/closedir.c:8 #1  0x00007ff0dfa4abc2 in FSArch::ModVArch::start (this=0x7ff0deaaacf0) at val.cpp:123 #2  0x00007ff0e10ec4ab in OSCADA::TVArchivator::cntrCmdProc (this=0x7ff0deaaacf0, opt=0x7ff0de6edb10) at tarchval.cpp:2483 #3  0x00007ff0dfa56f70 in FSArch::ModVArch::cntrCmdProc (this=0x7ff0deaaacf0, opt=0x7ff0de6edb10) at val.cpp:718 #4  0x00007ff0e12642e1 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0deaaacf0, opt=0x7ff0de6edb10, lev=0, ipath=..., off=47) at tcntrnode.cpp:212 #5  0x00007ff0e1263e93 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0dfc7c250, opt=0x7ff0de6edb10, lev=0, ipath=..., off=30) at tcntrnode.cpp:198 #6  0x00007ff0e1263e93 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0e096a430, opt=0x7ff0de6edb10, lev=0, ipath=..., off=23) at tcntrnode.cpp:198 #7  0x00007ff0e1263e93 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0e13d90c0, opt=0x7ff0de6edb10, lev=0, ipath=..., off=12) at tcntrnode.cpp:198 #8  0x00007ff0e014f81d in SelfPr::TProtIn::mess (this=0x7ff0df0c4780, request=..., answer=...) at self.cpp:444 #9  0x00007ff0dfcd24b2 in Sockets::TSocketIn::messPut (this=0x7ff0df11d6f0, sock=10, request=..., answer=..., sender=..., prot_in=...) at socket.cpp:926 #10 0x00007ff0dfccf8ba in Sockets::TSocketIn::ClTask (s_inf=0x7ff0de789390) at socket.cpp:814 #11 0x00007ff0e10501c5 in OSCADA::TSYS::taskWrap (stas=0x7ff0de9faa30) at tsys.cpp:2428 #12 0x00007ff0e139508b in start (p=0x7ff0de6f0ad8) at src/thread/pthread_create.c:203 #13 0x00007ff0e139738e in __clone () at src/thread/x86_64/clone.s:22  Если в реализации glibc разработчкики все же предусмотрели внутреннюю проверку на NULL, то в musl - нет, что и приводит к segfault. При просмотре другого кода OpenSCADA подобного поведения не обнаружил.  Прикрепил патч для версии 1+r2884. Также в него включил исправления для компиляции с gcc-12.2 + musl на Ваше усмотрение.  Благодарю.</description>
			<content:encoded><![CDATA[      Здравствуйте, Роман.<br />
<br />
При сборке системы под <a href="https://musl.libc.org" target="_blank" class="link_10">musl</a> вместо glibc вскрылась ошибка в модуле FSArch, которая заключается в виде вызова closedir() с NULL при отсутствии каталога архива.<br />
<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">Thread 1 (LWP 39):
#0  0x00007ff0e135b38e in closedir (dir=0x0) at src/dirent/closedir.c:8
#1  0x00007ff0dfa4abc2 in FSArch::ModVArch::start (this=0x7ff0deaaacf0) at val.cpp:123
#2  0x00007ff0e10ec4ab in OSCADA::TVArchivator::cntrCmdProc (this=0x7ff0deaaacf0, opt=0x7ff0de6edb10) at tarchval.cpp:2483
#3  0x00007ff0dfa56f70 in FSArch::ModVArch::cntrCmdProc (this=0x7ff0deaaacf0, opt=0x7ff0de6edb10) at val.cpp:718
#4  0x00007ff0e12642e1 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0deaaacf0, opt=0x7ff0de6edb10, lev=0, ipath=..., off=47) at tcntrnode.cpp:212
#5  0x00007ff0e1263e93 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0dfc7c250, opt=0x7ff0de6edb10, lev=0, ipath=..., off=30) at tcntrnode.cpp:198
#6  0x00007ff0e1263e93 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0e096a430, opt=0x7ff0de6edb10, lev=0, ipath=..., off=23) at tcntrnode.cpp:198
#7  0x00007ff0e1263e93 in OSCADA::TCntrNode::cntrCmd (this=0x7ff0e13d90c0, opt=0x7ff0de6edb10, lev=0, ipath=..., off=12) at tcntrnode.cpp:198
#8  0x00007ff0e014f81d in SelfPr::TProtIn::mess (this=0x7ff0df0c4780, request=..., answer=...) at self.cpp:444
#9  0x00007ff0dfcd24b2 in Sockets::TSocketIn::messPut (this=0x7ff0df11d6f0, sock=10, request=..., answer=..., sender=..., prot_in=...) at socket.cpp:926
#10 0x00007ff0dfccf8ba in Sockets::TSocketIn::ClTask (s_inf=0x7ff0de789390) at socket.cpp:814
#11 0x00007ff0e10501c5 in OSCADA::TSYS::taskWrap (stas=0x7ff0de9faa30) at tsys.cpp:2428
#12 0x00007ff0e139508b in start (p=0x7ff0de6f0ad8) at src/thread/pthread_create.c:203
#13 0x00007ff0e139738e in __clone () at src/thread/x86_64/clone.s:22</pre></div><br />
<br />
Если в реализации glibc разработчкики все же предусмотрели внутреннюю проверку на NULL, то в musl - нет, что и приводит к segfault. При просмотре другого кода OpenSCADA подобного поведения не обнаружил.<br />
<br />
Прикрепил патч для версии 1+r2884. Также в него включил исправления для компиляции с gcc-12.2 + musl на Ваше усмотрение.<br />
<br />
Благодарю.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>dudanov</dc:creator>
		</item>
		
		<item>
			<title>LTS 0.9.x Некорректная работа Serial с собственным протоколом</title>
			<link>http://oscada.org/en/forum/posts///10222/</link>
			<pubDate>Mon, 16 May 2022 13:59:02 +0300</pubDate>
			<description>Что не ошибка, тем более для LTS, поскольку этот протокол не предназначен для работы через Serial, а соответственно не имеет механизмов контроля целостности и ожидает как минимум прихода заголовка целиком, чего Serial не гарантирует!</description>
			<content:encoded><![CDATA[      Что не ошибка, тем более для LTS, поскольку этот протокол не предназначен для работы через Serial, а соответственно не имеет механизмов контроля целостности и ожидает как минимум прихода заголовка целиком, чего Serial не гарантирует!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>LTS 0.9.x Некорректная работа Serial с собственным протоколом</title>
			<link>http://oscada.org/en/forum/posts///10221/</link>
			<pubDate>Mon, 16 May 2022 13:45:36 +0300</pubDate>
			<description>Добрый день.  Проблема: При работе с транспортом Serial собственного протокола пользователя из ответа приходит только первый байт, остальное висит в буфере и может быть вычитано через cat /dev/ttyUSB0  Анализ: Причина в файле mod_serial.cpp, функция TTrOut::MessIO, в функции приема:  	    // * Force wait any data in the request mode or EAGAIN 	    // * No wait any data in the not request mode but it can get the data later 	    for(int iRtr = 0; (((blen=read(fd,iBuf,iLen)) == 0 &amp;&amp; !notReq) || (blen &lt; 0 &amp;&amp; errno == EAGAIN)) &amp;&amp; iRtr &lt; time; ++iRtr) 		TSYS::sysSleep(1e-3);   При опросе готового модуля ModBus в функцию MessIO передается последним 5-м параметром таймаут ответа, который помещается в time. В пользовательском протоколе на входе 4 параметра, time по дефолту =0. Поэтому данная процедура выполняется всегда только 1 раз, после чего MessIO завершается, приняв только 1 байт ответа.  Решение: Переписал этот участок кода так, чтобы при нулевом time таймаут брался из символьного таймаута в параметрах Serial, а чтение повторялось до тех пор, пока принимаются байты и нет символьного таймаута, либо пока не заполнен входной буфер.   	//===============================================	 		/* 		Процедура чтения до символьного либо общего (если указан) таймаута 		Вход:  		notReq - ответ НЕ требуется 		blen - число принятых байт / еррор если &lt; 0 		time - таймаут с последнего символа входной 		wCharTm - таймаут символа (мс) 		 		Было раньше: чтение до таймаута time, blen не накапливается 		Изменение: blen накапливает принятые байты, процедура чтения повторяется, 		           пока с последнего символа не вылезет таймаут WCharTm 				   READ выполняется в промежуточный буфер 		*/ 		blen=0; 		int iRtr=0; 		int bidx=0; // index counter 		ssize_t blen1=0; 		int itmo; 		itmo=time ? time :  wCharTm;  		while(1) { 		 TSYS::sysSleep(1e-3); 		 blen+=vmax(0,blen1); 		 blen1=read(fd, &amp;iBuf,iLen-bidx); 		if (blen1 &lt; 0 &amp;&amp; errno != EAGAIN) {blen=blen1; break;}	// exit on error 		if (blen1 == 0 &amp;&amp; notReq) {blen=blen1;break;}			//no response required 		if (blen1 &gt; 0) {iRtr=0; bidx+=blen1;}                   // clear  last symbol timeout, move buffer index 		if (iRtr++ &gt;=itmo) {blen+=vmax(0,blen1); break;} // timeout exit 				} 		 		 	//===============================================	  </description>
			<content:encoded><![CDATA[      Добрый день.<br />
<br />
Проблема: При работе с транспортом Serial собственного протокола пользователя из ответа приходит только первый байт, остальное висит в буфере и может быть вычитано через cat /dev/ttyUSB0<br />
<br />
Анализ:<br />
Причина в файле mod_serial.cpp, функция TTrOut::MessIO, в функции приема:<br />
<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">// * Force wait any data in the request mode or EAGAIN
	    // * No wait any data in the not request mode but it can get the data later
	    for(int iRtr = 0; (((blen=read(fd,iBuf,iLen)) == 0 &amp;&amp; !notReq) || (blen &lt; 0 &amp;&amp; errno == EAGAIN)) &amp;&amp; iRtr &lt; time; ++iRtr)
		TSYS::sysSleep(1e-3);</pre></div><br />
<br />
При опросе готового модуля ModBus в функцию MessIO передается последним 5-м параметром таймаут ответа, который помещается в time. В пользовательском протоколе на входе 4 параметра, time по дефолту =0. Поэтому данная процедура выполняется всегда только 1 раз, после чего MessIO завершается, приняв только 1 байт ответа.<br />
<br />
Решение:<br />
Переписал этот участок кода так, чтобы при нулевом time таймаут брался из символьного таймаута в параметрах Serial, а чтение повторялось до тех пор, пока принимаются байты и нет символьного таймаута, либо пока не заполнен входной буфер.<br />
<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">//===============================================	
		/*
		Процедура чтения до символьного либо общего (если указан) таймаута
		Вход: 
		notReq - ответ НЕ требуется
		blen - число принятых байт / еррор если &lt; 0
		time - таймаут с последнего символа входной
		wCharTm - таймаут символа (мс)
&nbsp;
		Было раньше: чтение до таймаута time, blen не накапливается
		Изменение: blen накапливает принятые байты, процедура чтения повторяется,
		           пока с последнего символа не вылезет таймаут WCharTm
				   READ выполняется в промежуточный буфер
		*/
		blen=0;
		int iRtr=0;
		int bidx=0; // index counter
		ssize_t blen1=0;
		int itmo;
		itmo=time ? time :  wCharTm;
&nbsp;
		while(1) {
		 TSYS::sysSleep(1e-3);
		 blen+=vmax(0,blen1);
		 blen1=read(fd, &amp;iBuf[bidx],iLen-bidx);
		if (blen1 &lt; 0 &amp;&amp; errno != EAGAIN) {blen=blen1; break;}	// exit on error
		if (blen1 == 0 &amp;&amp; notReq) {blen=blen1;break;}			//no response required
		if (blen1 &gt; 0) {iRtr=0; bidx+=blen1;}                   // clear  last symbol timeout, move buffer index
		if (iRtr++ &gt;=itmo) {blen+=vmax(0,blen1); break;} // timeout exit
				}
&nbsp;
&nbsp;
	//===============================================</pre></div>      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>Syberian</dc:creator>
		</item>
		
		<item>
			<title>Не принемает команды &quot;входной&quot; пользовательский протокол</title>
			<link>http://oscada.org/en/forum/posts///10168/</link>
			<pubDate>Sun, 26 Dec 2021 19:38:47 +0200</pubDate>
			<description> У меня всё, всегда и везде работает, поэтому НЕ ОШИБКА!  И со спецификой ваших проблем и кода тут никто разбираться не будет, правила читаем!  То что у вас всё работает это хорошо.  Но когда спрашивают, почему виснет намертво обработчик входного транспорта скрипта пользовательского протокола и вы не пытаетесь в этом разобраться  или оказать содействие в этом, как бы это не красиво. Скорее всего код не оптимизирован под расбери пи нормально. То что зависания происходят из-за занятости sd-карты или от сильной загрузки системы ввода вывода. Я этот глюк словил когда производил полное копирование сд карты. Но глюк возникает периодически. Если не хотите в этом разбирается, тогда уж напишите, что расбери пи не поддерживаю и ставьте мою программу на свой страх и риск.</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;roman&quot; wrote:<br /><br />
У меня всё, всегда и везде работает, поэтому НЕ ОШИБКА!<br />
<br />
И со спецификой ваших проблем и кода тут никто разбираться не будет, правила читаем!<br />
</div><br />
То что у вас всё работает это хорошо. <br />
Но когда спрашивают, почему виснет намертво обработчик входного транспорта скрипта пользовательского протокола и вы не пытаетесь в этом разобраться <br />
или оказать содействие в этом, как бы это не красиво. Скорее всего код не оптимизирован под расбери пи нормально. То что зависания происходят из-за занятости sd-карты или от сильной загрузки системы ввода вывода.<br />
Я этот глюк словил когда производил полное копирование сд карты. Но глюк возникает периодически. Если не хотите в этом разбирается, тогда уж напишите, что расбери пи не поддерживаю и ставьте мою программу на свой страх и риск.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>masterzx</dc:creator>
		</item>
		
		<item>
			<title>Не принемает команды &quot;входной&quot; пользовательский протокол</title>
			<link>http://oscada.org/en/forum/posts///10167/</link>
			<pubDate>Thu, 23 Dec 2021 08:24:06 +0200</pubDate>
			<description>У меня всё, всегда и везде работает, поэтому НЕ ОШИБКА!  И со спецификой ваших проблем и кода тут никто разбираться не будет, правила читаем!</description>
			<content:encoded><![CDATA[      У меня всё, всегда и везде работает, поэтому НЕ ОШИБКА!<br />
<br />
И со спецификой ваших проблем и кода тут никто разбираться не будет, правила читаем!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>Не принемает команды &quot;входной&quot; пользовательский протокол</title>
			<link>http://oscada.org/en/forum/posts///10166/</link>
			<pubDate>Thu, 23 Dec 2021 04:15:07 +0200</pubDate>
			<description>Здравствуйте.  OpenSCADA 1+r2784 raspberrypi pi3 model b+ Linux-5.10.63-v7  Через некоторое время перестаёт работать исполнение команд из входной части скрипта пользовательского протокола. Выходная работает. Входной транспорт принимает сообщения. Перезапуском скрипта или(и) транспорта не решается эта проблема.  Помогает, только полный перезапуск программы. Входная часть: ring=SYS.sub_DAQ.get();  tel2=&quot;+71234567890&quot;; tel3=&quot;+71234567890&quot;; tel4=&quot;+71234567890&quot;;   if((request.indexOf(&quot;RING\r\n\r\n+CLIP: \&quot;&quot;)&gt;0)&amp;&amp;ring){ 	if(request.indexOf(tel1+&quot;\&quot;&quot;)&gt;0){ 		SYS.sub_DAQ.set(tel1); 		ring=false; 		answer = &quot;ATA\r\n&quot;; 		request = &quot;&quot;; 	}else if(request.indexOf(tel2+&quot;\&quot;&quot;)&gt;0){ 		SYS.sub_DAQ.set(tel2); 		ring=false; 		answer = &quot;ATA\r\n&quot;; 		request = &quot;&quot;; 	}else if(request.indexOf(tel3+&quot;\&quot;&quot;)&gt;0){ 		SYS.sub_DAQ.set(tel3); 		ring=false; 		answer = &quot;ATA\r\n&quot;; 		request = &quot;&quot;; 	}else if(request.indexOf(tel4+&quot;\&quot;&quot;)&gt;0){ 		SYS.sub_DAQ.set(tel4); 		ring=false; 		answer = &quot;ATA\r\n&quot;; 		request = &quot;&quot;; 	}else{ 		answer=&quot;ATH\r\n&quot;; 		ring=true; 		request = &quot;&quot;; 	} }else if((request.indexOf(&quot;RING&quot;)&gt;0)&amp;&amp;ring){ SYS.sub_DAQ.set(true); request = &quot;&quot;; }    if(!ring){ 	if(request.indexOf(&quot;NO CARRIER&quot;) &gt; 0){ 		equest = &quot;&quot;; 		ring=true; 	}else if(request.indexOf(&quot;#DTMFEV: #&quot;) &gt; 0){ 		answer=&quot;ATH\r\n&quot;; 		ring=true; 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: *&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 0&quot;) &gt; 0){ 		SYS.sub_DAQ.set(true); 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 1&quot;) &gt; 0){ 		request = &quot;&quot;; 		SYS.sub_DAQ.set(true); 	}else if(request.indexOf(&quot;#DTMFEV: 2&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 3&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 4&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 5&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 6&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 7&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 8&quot;) &gt; 0){ 		request = &quot;&quot;; 	}else if(request.indexOf(&quot;#DTMFEV: 9&quot;) &gt; 0){ 		request = &quot;&quot;; 	} request = &quot;&quot;; }                                     if(request.indexOf(&quot;+CMT:&quot;)&gt;0){ 	if(request.indexOf(tel1)&gt;0){ 		SYS.sub_DAQ.set(tel1); 	}else if(request.indexOf(tel2)&gt;0){ 		SYS.sub_DAQ.set(tel2); 	}else if(request.indexOf(tel3)&gt;0){ 		SYS.sub_DAQ.set(tel3); 	}else if(request.indexOf(tel4)&gt;0){ 	SYS.sub_DAQ.set(tel4); 	} 	if(request.indexOf(&quot;pusk&quot;)&gt;0){ 		SYS.sub_DAQ.set(true); 		SYS.sub_DAQ.set(true); 	}else if(request.indexOf(&quot;stop&quot;)&gt;0){ 		SYS.sub_DAQ.set(true); 		SYS.sub_DAQ.set(true); 	}else if(request.indexOf(&quot;status&quot;)&gt;0){  	}else if(request.indexOf(&quot;reset&quot;)&gt;0){  	} 	request = &quot;&quot;; }  SYS.sub_DAQ.set(ring); return 0; Выходная часть: //Transport's timings check if(tr.timings() != &quot;5000:100&quot;)	tr.timings(&quot;5000:100&quot;); io.setAttr(&quot;err&quot;, &quot;&quot;); if(io.name() == &quot;init&quot;) { //Disable ECHO 	rez = tr.messIO(&quot;AT\r\n&quot;); 	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 	if(rez.indexOf(&quot;OK\r\n&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;101:&quot;+tr(&quot;Error disabling at: %1&quot;).replace(&quot;%1&quot;,rez)); return; }  rez = tr.messIO(&quot;AT#DTMF=1\r\n&quot;); 	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 	if(rez.indexOf(&quot;OK\r\n&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;102:&quot;+tr(&quot;Error disabling DTMF: %1&quot;).replace(&quot;%1&quot;,rez)); return; }  rez = tr.messIO(&quot;AT+CLIP=1\r\n&quot;); 	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 	if(rez.indexOf(&quot;OK\r\n&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;103:&quot;+tr(&quot;Error disabling clip: %1&quot;).replace(&quot;%1&quot;,rez)); return; }  rez = tr.messIO(&quot;AT+CMGF=1\r\n&quot;); 	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 	if(rez.indexOf(&quot;OK\r\n&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;104:&quot;+tr(&quot;Error disabling CMGF: %1&quot;).replace(&quot;%1&quot;,rez)); return; }  rez = tr.messIO(&quot;AT+CNMI=3,2,2,1,0\r\n&quot;); 	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 	if(rez.indexOf(&quot;OK\r\n&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;105:&quot;+tr(&quot;Error disabling CNMI: %1&quot;).replace(&quot;%1&quot;,rez)); return; }  }  //Request form: //&lt;{cmd} pin=&quot;1111&quot; tel=&quot;+380XXXXXXXXX&quot; text=&quot;{0|1}&quot; err=&quot;1:Error&quot;&gt;{SMSText}&lt;/cmd&gt; //  cmd - command, for now only &quot;send&quot; allowed; //  pin - PIN code to the SIM card access; //  tel - telephone number for receiver (remote cell phone or GSM modem); //  text{0,1} - SMS in the text mode, only ASCII //  SMSText - the message text; //  err - sets for the request result.   if(io.name() == &quot;send&quot;) { 	tel = io.attr(&quot;tel&quot;); 	if(!tel.length || tel != &quot;+&quot;) { io.setAttr(&quot;err&quot;, &quot;100:&quot;+tr(&quot;Telephone number error.&quot;)); return; } 	 		//Switch to Text SMS mode 		rez = tr.messIO(&quot;AT+CMGF=1\r&quot;); 		while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 		if(rez.indexOf(&quot;OK\r&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;103:&quot;+tr(&quot;Error setting the SMS Text mode: %1&quot;).replace(&quot;%1&quot;,rez)); return; }  		//Send the Telephone number 		rez = tr.messIO(&quot;AT+CMGS=\&quot;&quot;+tel+&quot;\&quot;\r&quot;); 		while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 		if(rez.indexOf(&quot;&gt;&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;104:&quot;+tr(&quot;Error sending SMS: %1&quot;).replace(&quot;%1&quot;,rez)); return; } 		rez = tr.messIO(io.text()+&quot;\x1A&quot;); 		while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez; 		//for(var iTr = 0; iTr &lt; 100 &amp;&amp; rez.indexOf(&quot;OK\r&quot;) &lt; 0; iTr++) rez += tr.messIO(&quot;&quot;);	//Up to 10 seconds wait for reply 		if(rez.indexOf(&quot;OK\r&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;104:&quot;+tr(&quot;Error sending SMS PDU: %1&quot;).replace(&quot;%1&quot;,rez)); return; } 	 	io.setAttr(&quot;err&quot;, &quot;0&quot;); } Скрипт логического уровня переключающий модем между входным и выходным траспортами function out_mod(){ SYS.sub_DAQ.set(false); req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/in_modem/%2fprm%2fst%2fst&quot;).setText(false); SYS.cntrReq(req); req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/out_modem/%2fprm%2fst%2fst&quot;).setText(true); SYS.cntrReq(req); }  function in_mod(){ req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/in_modem/%2fprm%2fst%2fst&quot;).setText(true); SYS.cntrReq(req); req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/out_modem/%2fprm%2fst%2fst&quot;).setText(false); SYS.cntrReq(req); SYS.sub_DAQ.set(true); }  if(init){ out_mod(); req = SYS.XMLNode(&quot;init&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;); SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;); if(!req.attr(&quot;err&quot;).length) f_err=req.text(); in_mod();  init=false; } if(pusk){ out_mod(); req = SYS.XMLNode(&quot;send&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;).setAttr(&quot;tel&quot;,tel).setText(&quot;Pump start&quot;); SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;); if(!req.attr(&quot;err&quot;).length) f_err=req.text(); in_mod(); pusk=false; }  if(stop){ out_mod(); req = SYS.XMLNode(&quot;send&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;).setAttr(&quot;tel&quot;,tel).setText(&quot;Pump stop&quot;); SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;); if(!req.attr(&quot;err&quot;).length) f_err=req.text(); in_mod(); stop=false; }  if(avaria){ out_mod(); req = SYS.XMLNode(&quot;send&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;).setAttr(&quot;tel&quot;,tel).setText(&quot;Problema s elektrosetyu&quot;); SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;); if(!req.attr(&quot;err&quot;).length) f_err=req.text(); in_mod(); avaria=false; } </description>
			<content:encoded><![CDATA[      Здравствуйте. <br />
OpenSCADA 1+r2784<br />
raspberrypi pi3 model b+<br />
Linux-5.10.63-v7<br />
<br />
Через некоторое время перестаёт работать исполнение команд из входной части скрипта пользовательского протокола.<br />
Выходная работает.<br />
Входной транспорт принимает сообщения. Перезапуском скрипта или(и) транспорта не решается эта проблема. <br />
Помогает, только полный перезапуск программы.<br />
Входная часть:<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">ring=SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_ring&quot;].get();
&nbsp;
tel2=&quot;+71234567890&quot;;
tel3=&quot;+71234567890&quot;;
tel4=&quot;+71234567890&quot;;
&nbsp;
&nbsp;
if((request.indexOf(&quot;RING
&nbsp;
+CLIP: \&quot;&quot;)&gt;0)&amp;&amp;ring){
	if(request.indexOf(tel1+&quot;\&quot;&quot;)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel1);
		ring=false;
		answer = &quot;ATA
&quot;;
		request = &quot;&quot;;
	}else if(request.indexOf(tel2+&quot;\&quot;&quot;)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel2);
		ring=false;
		answer = &quot;ATA
&quot;;
		request = &quot;&quot;;
	}else if(request.indexOf(tel3+&quot;\&quot;&quot;)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel3);
		ring=false;
		answer = &quot;ATA
&quot;;
		request = &quot;&quot;;
	}else if(request.indexOf(tel4+&quot;\&quot;&quot;)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel4);
		ring=false;
		answer = &quot;ATA
&quot;;
		request = &quot;&quot;;
	}else{
		answer=&quot;ATH
&quot;;
		ring=true;
		request = &quot;&quot;;
	}
}else if((request.indexOf(&quot;RING&quot;)&gt;0)&amp;&amp;ring){
SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_init&quot;].set(true);
request = &quot;&quot;;
}
&nbsp;
&nbsp;
&nbsp;
if(!ring){
	if(request.indexOf(&quot;NO CARRIER&quot;) &gt; 0){
		equest = &quot;&quot;;
		ring=true;
	}else if(request.indexOf(&quot;#DTMFEV: #&quot;) &gt; 0){
		answer=&quot;ATH
&quot;;
		ring=true;
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: *&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 0&quot;) &gt; 0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_start&quot;].set(true);
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 1&quot;) &gt; 0){
		request = &quot;&quot;;
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_stop&quot;].set(true);
	}else if(request.indexOf(&quot;#DTMFEV: 2&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 3&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 4&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 5&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 6&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 7&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 8&quot;) &gt; 0){
		request = &quot;&quot;;
	}else if(request.indexOf(&quot;#DTMFEV: 9&quot;) &gt; 0){
		request = &quot;&quot;;
	}
request = &quot;&quot;;
}
&nbsp;
&nbsp;
if(request.indexOf(&quot;+CMT:&quot;)&gt;0){
	if(request.indexOf(tel1)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel1);
	}else if(request.indexOf(tel2)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel2);
	}else if(request.indexOf(tel3)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel3);
	}else if(request.indexOf(tel4)&gt;0){
	SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_test&quot;][&quot;prm_test&quot;][&quot;a_tel&quot;].set(tel4);
	}
	if(request.indexOf(&quot;pusk&quot;)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_sms&quot;].set(true);
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_start&quot;].set(true);
	}else if(request.indexOf(&quot;stop&quot;)&gt;0){
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_sms&quot;].set(true);
		SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_stop&quot;].set(true);
	}else if(request.indexOf(&quot;status&quot;)&gt;0){
&nbsp;
	}else if(request.indexOf(&quot;reset&quot;)&gt;0){
&nbsp;
	}
	request = &quot;&quot;;
}
&nbsp;
SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_nasos&quot;][&quot;prm_nasos&quot;][&quot;a_ring&quot;].set(ring);
return 0;</pre></div><br />
Выходная часть:<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">//Transport's timings check
if(tr.timings() != &quot;5000:100&quot;)	tr.timings(&quot;5000:100&quot;);
io.setAttr(&quot;err&quot;, &quot;&quot;);
if(io.name() == &quot;init&quot;) {
//Disable ECHO
	rez = tr.messIO(&quot;AT
&quot;);
	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
	if(rez.indexOf(&quot;OK
&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;101:&quot;+tr(&quot;Error disabling at: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
&nbsp;
rez = tr.messIO(&quot;AT#DTMF=1
&quot;);
	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
	if(rez.indexOf(&quot;OK
&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;102:&quot;+tr(&quot;Error disabling DTMF: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
&nbsp;
rez = tr.messIO(&quot;AT+CLIP=1
&quot;);
	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
	if(rez.indexOf(&quot;OK
&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;103:&quot;+tr(&quot;Error disabling clip: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
&nbsp;
rez = tr.messIO(&quot;AT+CMGF=1
&quot;);
	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
	if(rez.indexOf(&quot;OK
&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;104:&quot;+tr(&quot;Error disabling CMGF: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
&nbsp;
rez = tr.messIO(&quot;AT+CNMI=3,2,2,1,0
&quot;);
	while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
	if(rez.indexOf(&quot;OK
&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;105:&quot;+tr(&quot;Error disabling CNMI: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
&nbsp;
}
&nbsp;
//Request form:
//&lt;{cmd} pin=&quot;1111&quot; tel=&quot;+380XXXXXXXXX&quot; text=&quot;{0|1}&quot; err=&quot;1:Error&quot;&gt;{SMSText}&lt;/cmd&gt;
//  cmd - command, for now only &quot;send&quot; allowed;
//  pin - PIN code to the SIM card access;
//  tel - telephone number for receiver (remote cell phone or GSM modem);
//  text{0,1} - SMS in the text mode, only ASCII
//  SMSText - the message text;
//  err - sets for the request result.
&nbsp;
&nbsp;
if(io.name() == &quot;send&quot;) {
	tel = io.attr(&quot;tel&quot;);
	if(!tel.length || tel[0] != &quot;+&quot;) { io.setAttr(&quot;err&quot;, &quot;100:&quot;+tr(&quot;Telephone number error.&quot;)); return; }
&nbsp;
		//Switch to Text SMS mode
		rez = tr.messIO(&quot;AT+CMGF=1\r&quot;);
		while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
		if(rez.indexOf(&quot;OK\r&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;103:&quot;+tr(&quot;Error setting the SMS Text mode: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
&nbsp;
		//Send the Telephone number
		rez = tr.messIO(&quot;AT+CMGS=\&quot;&quot;+tel+&quot;\&quot;\r&quot;);
		while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
		if(rez.indexOf(&quot;&gt;&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;104:&quot;+tr(&quot;Error sending SMS: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
		rez = tr.messIO(io.text()+&quot;\x1A&quot;);
		while(rez.length &amp;&amp; (trez=tr.messIO(&quot;&quot;)).length) rez += trez;
		//for(var iTr = 0; iTr &lt; 100 &amp;&amp; rez.indexOf(&quot;OK\r&quot;) &lt; 0; iTr++) rez += tr.messIO(&quot;&quot;);	//Up to 10 seconds wait for reply
		if(rez.indexOf(&quot;OK\r&quot;) &lt; 0)	{ io.setAttr(&quot;err&quot;, &quot;104:&quot;+tr(&quot;Error sending SMS PDU: %1&quot;).replace(&quot;%1&quot;,rez)); return; }
&nbsp;
	io.setAttr(&quot;err&quot;, &quot;0&quot;);
}</pre></div><br />
Скрипт логического уровня переключающий модем между входным и выходным траспортами<br />
<div class="tx-mmforum-pi1-codeheader">JAVASCRIPT</div><div class="tx-mmforum-pi1-codeblock"><style type="text/css"><!----></style><pre style="margin:0px;">function out_mod(){
SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_dog_modem&quot;][&quot;prm_dog&quot;][&quot;a_work&quot;].set(false);
req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/in_modem/%2fprm%2fst%2fst&quot;).setText(false);
SYS.cntrReq(req);
req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/out_modem/%2fprm%2fst%2fst&quot;).setText(true);
SYS.cntrReq(req);
}
&nbsp;
function in_mod(){
req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/in_modem/%2fprm%2fst%2fst&quot;).setText(true);
SYS.cntrReq(req);
req = SYS.XMLNode(&quot;set&quot;).setAttr(&quot;path&quot;,&quot;/Transport/Serial/out_modem/%2fprm%2fst%2fst&quot;).setText(false);
SYS.cntrReq(req);
SYS.sub_DAQ[&quot;mod_LogicLev&quot;][&quot;cntr_dog_modem&quot;][&quot;prm_dog&quot;][&quot;a_work&quot;].set(true);
}
&nbsp;
if(init){
out_mod();
req = SYS.XMLNode(&quot;init&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;);
SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;);
if(!req.attr(&quot;err&quot;).length) f_err=req.text();
in_mod();
&nbsp;
init=false;
}
if(pusk){
out_mod();
req = SYS.XMLNode(&quot;send&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;).setAttr(&quot;tel&quot;,tel).setText(&quot;Pump start&quot;);
SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;);
if(!req.attr(&quot;err&quot;).length) f_err=req.text();
in_mod();
pusk=false;
}
&nbsp;
if(stop){
out_mod();
req = SYS.XMLNode(&quot;send&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;).setAttr(&quot;tel&quot;,tel).setText(&quot;Pump stop&quot;);
SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;);
if(!req.attr(&quot;err&quot;).length) f_err=req.text();
in_mod();
stop=false;
}
&nbsp;
if(avaria){
out_mod();
req = SYS.XMLNode(&quot;send&quot;).setAttr(&quot;ProtIt&quot;,&quot;sms_call&quot;).setAttr(&quot;tel&quot;,tel).setText(&quot;Problema s elektrosetyu&quot;);
SYS.Transport.Serial.out_modem.messIO(req,&quot;UserProtocol&quot;);
if(!req.attr(&quot;err&quot;).length) f_err=req.text();
in_mod();
avaria=false;
}</pre></div><br />
      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>masterzx</dc:creator>
		</item>
		
		<item>
			<title>не все GPIO доступны в OPENSCADA</title>
			<link>http://oscada.org/en/forum/posts///10143/</link>
			<pubDate>Wed, 08 Sep 2021 13:49:12 +0300</pubDate>
			<description> Базовое количество IO RPi это не ошибка!!!  к сожалению я не нашел куда отнести данное замечание, так вопрос остаётся - можно ли добавить GPIO, или может самому как-то можно сконфигурировать нужные номера?</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;roman&quot; wrote:<br /><br />
Базовое количество IO RPi это не ошибка!!!<br />
</div><br />
к сожалению я не нашел куда отнести данное замечание,<br />
так вопрос остаётся - можно ли добавить GPIO, или может самому как-то можно сконфигурировать нужные номера?      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>Anton_z</dc:creator>
		</item>
		
		<item>
			<title>не все GPIO доступны в OPENSCADA</title>
			<link>http://oscada.org/en/forum/posts///10142/</link>
			<pubDate>Wed, 08 Sep 2021 12:55:25 +0300</pubDate>
			<description>Базовое количество IO RPi это не ошибка!!!</description>
			<content:encoded><![CDATA[      Базовое количество IO RPi это не ошибка!!!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>не все GPIO доступны в OPENSCADA</title>
			<link>http://oscada.org/en/forum/posts///10141/</link>
			<pubDate>Wed, 08 Sep 2021 12:51:50 +0300</pubDate>
			<description>Здравствуйте,  при попытке использовать модуль GPIO на плате Raspberry Pi Compute Module 3 выяснилось что в модуле daq-GPIO есть выбор только с GPIO 0 до GPIO 31, но данный аппаратный модуль использует до GPIO 45 можно ли расширить выбор до данного кол-ва входов, т.к. есть платы расширения где разведены только часть верхнего диапазона GPIO  версия ПО 0.9.4 LTS</description>
			<content:encoded><![CDATA[      Здравствуйте, <br />
при попытке использовать модуль GPIO на плате Raspberry Pi Compute Module 3<br />
выяснилось что в модуле daq-GPIO есть выбор только с GPIO 0 до GPIO 31,<br />
но данный аппаратный модуль использует до GPIO 45<br />
можно ли расширить выбор до данного кол-ва входов,<br />
т.к. есть платы расширения где разведены только часть верхнего диапазона GPIO<br />
<br />
версия ПО 0.9.4 LTS      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>Anton_z</dc:creator>
		</item>
		
		<item>
			<title>Modbus RTU через TCP</title>
			<link>http://oscada.org/en/forum/posts///10140/</link>
			<pubDate>Wed, 08 Sep 2021 11:47:10 +0300</pubDate>
			<description>Поставил 100 но ситуация не поменялась</description>
			<content:encoded><![CDATA[      Поставил 100 но ситуация не поменялась      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>tka4ev_s</dc:creator>
		</item>
		
		<item>
			<title>Modbus RTU через TCP</title>
			<link>http://oscada.org/en/forum/posts///10139/</link>
			<pubDate>Tue, 07 Sep 2021 16:56:49 +0300</pubDate>
			<description>В видео время ожидания соединения = 0. Обычно ставим 50-100 миллисекунд.</description>
			<content:encoded><![CDATA[      В видео время ожидания соединения = 0. Обычно ставим 50-100 миллисекунд.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>almaz</dc:creator>
		</item>
		
		<item>
			<title>Modbus RTU через TCP</title>
			<link>http://oscada.org/en/forum/posts///10138/</link>
			<pubDate>Mon, 06 Sep 2021 13:24:38 +0300</pubDate>
			<description>Добрый день !  Столкнулся со странным поведением скады не могу выключить контроллер MODBUS.  Прикрепил видео происходящего https://drive.google.com/file/d/1VedlRdZB8DFvoeDk7UrmrR4X7i0pzGsh/view?usp=sharing </description>
			<content:encoded><![CDATA[      Добрый день ! <br />
Столкнулся со странным поведением скады не могу выключить контроллер MODBUS.<br />
<br />
Прикрепил видео происходящего<br />
<a href="https://drive.google.com/file/d/1VedlRdZB8DFvoeDk7UrmrR4X7i0pzGsh/view?usp=sharing" target="_blank" class="link_10">https://drive.google.com/file/d/1VedlRdZB8DFvoeDk7UrmrR4X7i0pzGsh/view?usp=sharing</a><br />
      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>tka4ev_s</dc:creator>
		</item>
		
		<item>
			<title>Vision, Gentoo, Qt-5.15.2: не раскрываются составные аттрибуты</title>
			<link>http://oscada.org/en/forum/posts///10127/</link>
			<pubDate>Fri, 20 Aug 2021 21:31:46 +0300</pubDate>
			<description>Да, теперь без пача атрибуты раскрываются, версия 2764.</description>
			<content:encoded><![CDATA[      Да, теперь без пача атрибуты раскрываются, версия 2764.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>IrmIngeneer</dc:creator>
		</item>
		
		<item>
			<title>Vision, Gentoo, Qt-5.15.2: не раскрываются составные аттрибуты</title>
			<link>http://oscada.org/en/forum/posts///10126/</link>
			<pubDate>Fri, 20 Aug 2021 20:35:01 +0300</pubDate>
			<description> Что не проблема OpenSCADA, а проблема Qt.  Собственно в классе QAbstractTableModel в Qt 5.15 опять что-то переопределили криво, как было ранее с ним-же в Qt5.11 для функции sibling().  Поэтому окончательно меняется на QAbstractItemModel, что не существенно для модели.  P.S. С выходом Debian 11, в течении последних пары дней собирал для него OpenSCADA, по ходу глубже адаптировал к Qt5, решая кучу предупреждений, а также исправил и проверил этот случай!</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;roman&quot; wrote:<br /><br />
Что не проблема OpenSCADA, а проблема Qt.<br />
</div><br />
Собственно в классе QAbstractTableModel в Qt 5.15 опять что-то переопределили криво, как было ранее с ним-же в Qt5.11 для функции sibling().<br />
<br />
Поэтому окончательно меняется на QAbstractItemModel, что не существенно для модели.<br />
<br />
P.S. С выходом Debian 11, в течении последних пары дней собирал для него OpenSCADA, по ходу глубже адаптировал к Qt5, решая кучу предупреждений, а также исправил и проверил этот случай!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>потеря страниц Web интерфейса проекта</title>
			<link>http://oscada.org/en/forum/posts///10125/</link>
			<pubDate>Fri, 20 Aug 2021 16:53:01 +0300</pubDate>
			<description>Роман,  Замечано, что если подключаться к интерфейсу с того же хоста, где работает проект, зависаний не наблюдается. Но если подключится с компьютера в другой подсети, то  то зависания будут сильно выражены. Частично удалось решить эту проблему изменением периода выполнения сеанса, увеличив его. но от этого пострадала скорость работы сайта. </description>
			<content:encoded><![CDATA[      Роман, <br />
Замечано, что если подключаться к интерфейсу с того же хоста, где работает проект, зависаний не наблюдается. Но если подключится с компьютера в другой подсети, то  то зависания будут сильно выражены.<br />
Частично удалось решить эту проблему изменением периода выполнения сеанса, увеличив его. но от этого пострадала скорость работы сайта.<br />
      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>DmitrijP</dc:creator>
		</item>
		
		<item>
			<title>потеря страниц Web интерфейса проекта</title>
			<link>http://oscada.org/en/forum/posts///10124/</link>
			<pubDate>Fri, 20 Aug 2021 15:35:40 +0300</pubDate>
			<description>У меня ничего подобного нет, и пока его нет это не ошибка.</description>
			<content:encoded><![CDATA[      У меня ничего подобного нет, и пока его нет это не ошибка.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>потеря страниц Web интерфейса проекта</title>
			<link>http://oscada.org/en/forum/posts///10123/</link>
			<pubDate>Fri, 20 Aug 2021 15:05:54 +0300</pubDate>
			<description>Добрый день, Роман, прошу помочь.   При переходе по страницам проекта в браузере может возникнуть ситуация, когда реакция на действия пользователя пропадает. (Например невозможно перейти на другую страницу) Пользователь видит текущую страницу, но она неактивна. Активны толь кнопки корневой страницы   Было замечено с помощью Интерфейсы Пользователя-&gt;Движок среды визуализации и управления -&gt;Сеанс -&gt;&quot;Имя проекта&quot; в окне &quot;Открытые страницы&quot; что текущая страница на которой пользователь находился (См. рис. Исходная), пропадает, после того как пользователь попытался перейти на другую страницу.   Остаётся только корневая страница (См. рис. После перехода).   OpenSCADA v1 r2761</description>
			<content:encoded><![CDATA[      Добрый день,<br />
Роман, прошу помочь. <br />
<br />
При переходе по страницам проекта в браузере может возникнуть ситуация, когда реакция на действия пользователя пропадает. (Например невозможно перейти на другую страницу)<br />
Пользователь видит текущую страницу, но она неактивна. Активны толь кнопки корневой страницы <br />
<br />
Было замечено с помощью Интерфейсы Пользователя-&gt;Движок среды визуализации и управления -&gt;Сеанс -&gt;&quot;Имя проекта&quot; в окне &quot;Открытые страницы&quot; что текущая страница на которой пользователь находился (См. рис. Исходная), пропадает, после того как пользователь попытался перейти на другую страницу. <br />
<br />
Остаётся только корневая страница (См. рис. После перехода). <br />
<br />
OpenSCADA v1 r2761      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>DmitrijP</dc:creator>
		</item>
		
		<item>
			<title>Транспорты-&gt;Внешние хосты: Некорректная работа таблицы</title>
			<link>http://oscada.org/en/forum/posts///10120/</link>
			<pubDate>Sat, 07 Aug 2021 07:23:15 +0300</pubDate>
			<description> При попытке добавить запись в таблицу внешних хостов, введённые данные после выхода из ячейки прыгают на следующую строку. В итоге половина введённых полей вообще не сохраняется. Версия 1+r2761. Проверял в Gentoo и Automation Linux.  Да, не доделал распространение полученного хеша пароля у сервера на соседние записи с такими параметрами аутентификации, что позже вылезло. Собственно уже исправлено!</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;psn8402&quot; wrote:<br /><br />
При попытке добавить запись в таблицу внешних хостов, введённые данные после выхода из ячейки прыгают на следующую строку. В итоге половина введённых полей вообще не сохраняется. Версия 1+r2761. Проверял в Gentoo и Automation Linux.<br />
</div><br />
Да, не доделал распространение полученного хеша пароля у сервера на соседние записи с такими параметрами аутентификации, что позже вылезло.<br />
Собственно уже исправлено!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>Транспорты-&gt;Внешние хосты: Некорректная работа таблицы</title>
			<link>http://oscada.org/en/forum/posts///10119/</link>
			<pubDate>Sat, 07 Aug 2021 01:30:59 +0300</pubDate>
			<description>При попытке добавить запись в таблицу внешних хостов, введённые данные после выхода из ячейки прыгают на следующую строку. В итоге половина введённых полей вообще не сохраняется. Версия 1+r2761. Проверял в Gentoo и Automation Linux.</description>
			<content:encoded><![CDATA[      При попытке добавить запись в таблицу внешних хостов, введённые данные после выхода из ячейки прыгают на следующую строку. В итоге половина введённых полей вообще не сохраняется. Версия 1+r2761. Проверял в Gentoo и Automation Linux.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>psn8402</dc:creator>
		</item>
		
		<item>
			<title>краш при обычном изменении параметров подуровня logiclev</title>
			<link>http://oscada.org/en/forum/posts///10118/</link>
			<pubDate>Wed, 28 Jul 2021 20:18:49 +0300</pubDate>
			<description> Отчёты сгенерированы без отладочной информации поэтому мало полезны, однако рекурсия там видна, т.е. привязка атрибута не самого себя, что дурь такая, которая даже не проверяется.  Прямая рекурсия собственно проверяется, а вот через несколько звеньев нет, что добавлено.  Исправлено!</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;roman&quot; wrote:<br /><br />
Отчёты сгенерированы без отладочной информации поэтому мало полезны, однако рекурсия там видна, т.е. привязка атрибута не самого себя, что дурь такая, которая даже не проверяется.<br />
</div><br />
Прямая рекурсия собственно проверяется, а вот через несколько звеньев нет, что добавлено.<br />
<br />
Исправлено!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>краш при обычном изменении параметров подуровня logiclev</title>
			<link>http://oscada.org/en/forum/posts///10117/</link>
			<pubDate>Wed, 28 Jul 2021 14:51:12 +0300</pubDate>
			<description> с отладочной информацией пока не разобрался как включить, а по поводу рекурсии видимо из-за того что строка link в одном из параметров logiclev по какой-то причине оказалось пустой, произошла ошибка рекурсии, после вставки корректного источника, краш перестал появляться.  Для пустых связей такое невозможно и нет нигде!</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;Anton_z&quot; wrote:<br /><br />
с отладочной информацией пока не разобрался как включить, а по поводу рекурсии видимо из-за того что строка link в одном из параметров logiclev по какой-то причине оказалось пустой, произошла ошибка рекурсии, после вставки корректного источника, краш перестал появляться.<br />
</div><br />
Для пустых связей такое невозможно и нет нигде!      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>краш при обычном изменении параметров подуровня logiclev</title>
			<link>http://oscada.org/en/forum/posts///10116/</link>
			<pubDate>Wed, 28 Jul 2021 14:38:10 +0300</pubDate>
			<description>  Менял параметры в logiclev в очередной раз (ничего не обычного) включаю запуск и программа крашиться и отказывается запускаться,   Детали! А вообще, читаем руководство и правила этого форума.  Отчёты сгенерированы без отладочной информации поэтому мало полезны, однако рекурсия там видна, т.е. привязка атрибута не самого себя, что дурь такая, которая даже не проверяется.    с отладочной информацией пока не разобрался как включить, а по поводу рекурсии видимо из-за того что строка link в одном из параметров logiclev по какой-то причине оказалось пустой, произошла ошибка рекурсии, после вставки корректного источника, краш перестал появляться. Спасибо за указание на ошибку.</description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;roman&quot; wrote:<br /><br />
<div class="tx-mmforum-pi1-pt-quote">&quot;Anton_z&quot; wrote:<br /><br />
Менял параметры в logiclev в очередной раз (ничего не обычного) включаю запуск и программа крашиться и отказывается запускаться, <br />
</div><br />
Детали!<br />
А вообще, читаем <a href="http://oscada.org/wiki/Special:MyLanguage/Documents/How_to/Crash_report" target="_blank" class="link_10">руководство</a> и правила этого форума.<br />
<br />
Отчёты сгенерированы без отладочной информации поэтому мало полезны, однако рекурсия там видна, т.е. привязка атрибута не самого себя, что дурь такая, которая даже не проверяется.<br />
<br />
</div><br />
<br />
с отладочной информацией пока не разобрался как включить, а по поводу рекурсии видимо из-за того что строка link в одном из параметров logiclev по какой-то причине оказалось пустой, произошла ошибка рекурсии, после вставки корректного источника, краш перестал появляться.<br />
Спасибо за указание на ошибку.      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>Anton_z</dc:creator>
		</item>
		
		<item>
			<title>краш при обычном изменении параметров подуровня logiclev</title>
			<link>http://oscada.org/en/forum/posts///10115/</link>
			<pubDate>Wed, 28 Jul 2021 14:13:52 +0300</pubDate>
			<description> Менял параметры в logiclev в очередной раз (ничего не обычного) включаю запуск и программа крашиться и отказывается запускаться,   Детали! А вообще, читаем руководство и правила этого форума.  Отчёты сгенерированы без отладочной информации поэтому мало полезны, однако рекурсия там видна, т.е. привязка атрибута не самого себя, что дурь такая, которая даже не проверяется. </description>
			<content:encoded><![CDATA[      <div class="tx-mmforum-pi1-pt-quote">&quot;Anton_z&quot; wrote:<br /><br />
Менял параметры в logiclev в очередной раз (ничего не обычного) включаю запуск и программа крашиться и отказывается запускаться, <br />
</div><br />
Детали!<br />
А вообще, читаем <a href="http://oscada.org/wiki/Special:MyLanguage/Documents/How_to/Crash_report" target="_blank" class="link_10">руководство</a> и правила этого форума.<br />
<br />
Отчёты сгенерированы без отладочной информации поэтому мало полезны, однако рекурсия там видна, т.е. привязка атрибута не самого себя, что дурь такая, которая даже не проверяется.<br />
      ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>roman</dc:creator>
		</item>
		
		<item>
			<title>краш при обычном изменении параметров подуровня logiclev</title>
			<link>http://oscada.org/en/forum/posts///10114/</link>
			<pubDate>Wed, 28 Jul 2021 12:47:45 +0300</pubDate>
			<description>Здравствуйте, не знал куда можно скинуть данную проблему. установленная свежая версия 0.9.4 LTS. Менял параметры в logiclev в очередной раз (ничего не обычного) включаю запуск и программа крашиться и отказывается запускаться,  при последующем запуске создается краш файл.  После нескольких перезагрузок она повисела несколько минут после создания очередного краш файла и вдруг запустился конфигуратор, но при закрытии пишет segmentation failed (core dumped). краш файлы приложил. </description>
			<content:encoded><![CDATA[      Здравствуйте, не знал куда можно скинуть данную проблему.<br />
установленная свежая версия 0.9.4 LTS.<br />
Менял параметры в logiclev в очередной раз (ничего не обычного) включаю запуск и программа крашиться и отказывается запускаться, <br />
при последующем запуске создается краш файл. <br />
После нескольких перезагрузок она повисела несколько минут после создания очередного краш файла и вдруг запустился конфигуратор, но при закрытии пишет segmentation failed (core dumped).<br />
краш файлы приложил.       ]]></content:encoded>
			<category>Отслеживание ошибок</category>
			<dc:creator>Anton_z</dc:creator>
		</item>
		
	</channel>
</rss>
