УкраїнськаEnglishmRussian
Вхід/Новий
У темі немає нових постів

[BugWrong] Некорректное поведение функции split() в процедуре шаблона параметра ModBus


Автор Повідомлення
Повідомлення створено: 18. 01. 2017 [23:11]
3dlogin
Илья Кузнецов
Автор теми
Зареєстрован(а) с: 06.04.2016
Повідомлення: 12
Шаги для воспроизведения:
1. Загрузить проект АГЛКС
2. Отключить (в целях редактирования) узел ModBus "test". Перейти на вкладку "IO" и для строки таблицы R_s110,10w ввести значение 1234567890987654321 (я просто дополнил имеющееся там значение 123456789, но можно использовать любую другую строку похожей длины). Включить узел обратно.
3. Создать библиотеку шаблонов testModbus. Создать в ней шаблон testSplit. Добавить атрибуты in (Вход, Строка, Только чтение, Связь), out (Выход, Объект, Только чтение, Переменная).
4. (необязательный пункт, для любознательных) Создать в шаблоне testSplit еще два атрибута: testString(Вход, Строка, Полный доступ, Переменная) и testArray(Выход, Объект, Только чтение, Переменная).
5. Выбрать язык JavaLikeCalc.Javascript и вести код процедуры в шаблоне testSplit:
JAVASCRIPT
using Special.FLibSYS;
 
encString = strDec4Bin(in);
out = encString.split(" ");
// testArray = testString.split(" "); // Раскомментировать, если выполняли пункт 4

6. Сделать доступными шаблон testSplit и библиотеку testModbus
7. В контроллере данных ModBus ->testTCP создать параметр test, тип Логический. Назначить параметру test шаблон testModbus.testSplit, включить параметр.
8. На вкладке "Конфигурация шаблона" параметра test ввести в поле in R_s:110,10:r (для доступа к нужным нам регистрам узла test).
9. Перейти на вкладку "Атрибуты" параметра test. В поле out наблюдать результат:
<TArrayObj>
<str>31</str>
<str>32</str>
<str>33</str>
<str>34</str>
<str>35</str>
<str>36</str>
<str>37</str>
<str>38</str>
<str>39</str>
<str>30</str>
<str>39</str>
<str>38</str>
<str>37</str>
<str>36</str>
<str>35</str>
<str>34
33</str>
<str>32</str>
<str>31</str>
<str>00</str>
</TArrayObj>

Для одного из элементов массива отсутствует закрывающий тэг </str>, для следующего - открывающий <str>. При прохождении в цикле по такому массиву строка "3433" будет считаться одним элементом, хотя по сути их должно быть 2. С другими входными данными наблюдал подобное поведение в нескольких местах в пределах одного массива.
Если же использовать encString.split(new RegExp("\\s")) , хоть, это не одно и то же, что encString.split(" "), то всё распарсится корректно.
10. (необязательный пункт, для любознательных) Скопировать в буфер обмена значение атрибута in на вкладке "Атрибуты" параметра test и вставить значение в поле атрибута testString. Нажать кнопку "Обновить" на тулбаре. В поле атрибута testArray будет корректно распарсенный массив строк.

Используемое окружение и версии:
- дистрибутив и ядро ОС: Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1 (2016-12-30) x86_64 GNU/Linux;
- OpenSCADA v. 0.9+r2461.
Повідомлення створено: 19. 01. 2017 [08:14]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"3dlogin" wrote:

<TArrayObj>
<str>31</str>
<str>32</str>
<str>33</str>
<str>34</str>
<str>35</str>
<str>36</str>
<str>37</str>
<str>38</str>
<str>39</str>
<str>30</str>
<str>39</str>
<str>38</str>
<str>37</str>
<str>36</str>
<str>35</str>
<str>34
33</str>
<str>32</str>
<str>31</str>
<str>00</str>
</TArrayObj>


Не ошибка, поскольку split() тут отработал корректно, а в месте "34 35" вовсе не пробел, а периодический перевод строки!
Для однозначности используем strDecode() с пустым аргументом "opt1", и split() тогда вообще не понадобится.

Learn, learn and learn better than work, work and work.



4649