1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Почему не работает

Вопросы технологии производства, эксплуатация производственного оборудования. Автоматизация производства (MES).
Ответить
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

Доброго времени суток.

Имею следующий код:

Код: Выделить всё

	IF FIND('OTVET[j]','$N') > 0  THEN
			IF LEN(OTVET[j])>=254 THEN
				j:=j+1;
			ELSE
				j:=0;
			END_IF
	END_IF
Работать он должен следующим образом: Что если в массиве, попадается символ $N, то с этого места строка переносится на следующую строку массива. Если строка длиннее 254 символов и не встречается $N то так же переносим строку.

Перенос в общем не работает, где я ошибся?

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3549
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 244 раза

Почему не работает

Сообщение Михайло »

Почему символ $N, а не \n?
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

Михайло писал(а): 21 янв 2020, 22:06 Почему символ $N, а не \n?
Потому что в строке содержится именно $N. И этот символ встречается в массиве часто, но почему-то FIND не работает.
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Почему не работает

Сообщение aranea »

Потому что у вас И, а должно быть ИЛИ
Изображение
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

aranea писал(а): 22 янв 2020, 09:16 Потому что у вас И, а должно быть ИЛИ
Получается должно быть так?

Код: Выделить всё

IF FIND('OTVET[j]','$N') > 0  OR LEN(OTVET[j])>=254 THEN
				j:=j+1;
			ELSE
				j:=0;
			END_IF
	END_IF
Опробовал, не помогло. У меня просто одна и та же строка начинает заполнять весь массив. Был вариант проще, сделать перенос просто по мере длины строки LEN, но в таком случается очень часто случается что примерно в промежутке 3-4 строки массива, строка заполнилась, затем затерлась, потом опять заполнилась и так 2 раза, и только потом заполнилась и запись продолжилась.

Таким образом из массива выпадает 2 строки с данными.
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Почему не работает

Сообщение aranea »

irrWN, вам нужно правильно сформулировать для себя задачу, а потом правильно ее реализовать с помощью программирования
только тогда она будет решена правильно и быстро (при наличии должной квалификации)
Изображение
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

aranea писал(а): 22 янв 2020, 10:04 irrWN, вам нужно правильно сформулировать для себя задачу, а потом правильно ее реализовать с помощью программирования
только тогда она будет решена правильно и быстро (при наличии должной квалификации)
На этом форуме вопросы можно задавать только «при наличии должной квалификации»? Если «Да», то вопрос можно считать закрытым.
Аватара пользователя

DemoN9577
осмотрелся
осмотрелся
Сообщения: 133
Зарегистрирован: 22 июл 2017, 22:47
Имя: Сергей
Страна: СССР
Благодарил (а): 6 раз
Поблагодарили: 25 раз

Почему не работает

Сообщение DemoN9577 »

Какое количество элементов в массиве OTVET[j]?
Не понятно условие задачи.
Вероятно у Вас есть строка переменной длины, вы её разбиваете на элементы по 255 символов.
После этого в каждом элементе пытаетесь найти заданный символ. Верно?
________________________________
Не ждите чуда - чудите сами!
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Почему не работает

Сообщение aranea »

irrWN, если OTVET[j] - это элемент массива строк, то, как вы сами выяснили, STRING не может быть длиннее 255 знаков, поэтому вот это вот: LEN(OTVET[j])>=254 - непонятно зачем
и почему j:=0 только вам известно что с этим делается дальше
Изображение
Аватара пользователя

DemoN9577
осмотрелся
осмотрелся
Сообщения: 133
Зарегистрирован: 22 июл 2017, 22:47
Имя: Сергей
Страна: СССР
Благодарил (а): 6 раз
Поблагодарили: 25 раз

Почему не работает

Сообщение DemoN9577 »

Если гадать дальше, то имеем некий поток данных неопределенной длинны, в котором разделителем пекета являемся $N. Далее: пакеты эти нужно разложить "по полочкам" в ячейки массива "OTVET".
И тут я соглашусь с aranea,
aranea писал(а): 22 янв 2020, 12:15почему j:=0
?
irrWN, поправляйте, разъясняйте что вы имеете, что нужно получить и как вы реализуете задачу.

Отправлено спустя 3 минуты 29 секунд:
aranea писал(а): 22 янв 2020, 12:15 вот это вот: LEN(OTVET[j])>=254 - непонятно зачем
Возможно как частный случай ограничения области поиска...
________________________________
Не ждите чуда - чудите сами!
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

DemoN9577 писал(а): 22 янв 2020, 11:29 Какое количество элементов в массиве OTVET[j]?
OTVET: ARRAY [0..16] OF STRING(255);
DemoN9577 писал(а): 22 янв 2020, 11:29 Вероятно у Вас есть строка переменной длины, вы её разбиваете на элементы по 255 символов.
Есть буфер, конечная длина которого мне пока что не известна. Это связано с тем, что когда буфер разбивается на массив, периодически происходит перезапись одной строки несколько раз.
aranea писал(а): 22 янв 2020, 12:15 вот это вот: LEN(OTVET[j])>=254 - непонятно зачем
Без этого, пишется только в OTVET[0], затираясь и перезаписываясь когда достигается 255 символов.
DemoN9577 писал(а): 22 янв 2020, 14:00 и почему j:=0 только вам известно что с этим делается дальше
j:=0; тут у меня подразумевалось что будет массив вида OTVET[j,k] потому что буфера приходят два с разницей в 30 минут.

Дальше из этого массива через MID я просто беру нужные мне символы с нужной позиции (которая в виду проблемы мне в данный момент не известна т.к. при каждом ответе массив смещается в хаотичном порядке, постоянна только OTVET[0]) для вывода в таблицу визуализации.
DemoN9577 писал(а): 22 янв 2020, 14:00 Если гадать дальше, то имеем некий поток данных неопределенной длинны, в котором разделителем пекета являемся $N.
Да, длина определенна, ведь счетчик энергии на сколько я знаю при каждом опросе не может отдать то одни значения, то другие. Меняются только показания. В ответе содержатся $R$N из документации понятно что это разделитель между кодами показаний.

Пояснение по поводу IF FIND('OTVET[j]','$N'): Таким образом я пытался обойти мою проблему, когда например OTVET[3] заполнился, то далее должен заполнятся OTVET[4], но вместо этого OTVET[3] обнуляется и туда пишется то, что должно быть в OTVET[4]. И так может быть абсолютно с любым элементом массива, каждый раз по разному. А обойти я пытался тем, что мне известно что перед каждым кодом счетчика гарантированно есть $N, таким образом я пытался сделать что как только элемент массива доходит до $N, то переходим на следующий элемент. Что бы каждый код счетчика был в отдельном элементе массива.

Linkel
осмотрелся
осмотрелся
Сообщения: 124
Зарегистрирован: 30 сен 2017, 21:41
Имя: Тимур
Благодарил (а): 14 раз
Поблагодарили: 7 раз

Почему не работает

Сообщение Linkel »

этот код, только проверяет условие?что еще от него ждать
:ext_sleep:
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

Linkel писал(а): 22 янв 2020, 19:02 этот код, только проверяет условие?что еще от него ждать
Ну да, простое условие, если данных много, переносим на следующую строку, если помещаются - то не переносим. Я просил помочь разобраться почему при переносе, у меня случается проблема описанная выше, в последнем абзаце.
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Почему не работает

Сообщение aranea »

irrWN писал(а): 23 янв 2020, 12:10 если данных много, переносим на следующую строку
где у вас в коде перенос-то? )))))
в OTVET[j] по определению не может быть более 255 символов, поэтому "перенести" таким условием вы можете только 1 символ - 255ый
почитайте уже что-нибудь по алгоритмам, программированию и работы с данными
Изображение
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

aranea писал(а): 23 янв 2020, 12:26
irrWN писал(а): 23 янв 2020, 12:10 если данных много, переносим на следующую строку
где у вас в коде перенос-то? )))))
в OTVET[j] по определению не может быть более 255 символов, поэтому "перенести" таким условием вы можете только 1 символ - 255ый
почитайте уже что-нибудь по алгоритмам, программированию и работы с данными
Хорошо. Название книги дадите где это прочитать можно?

Linkel
осмотрелся
осмотрелся
Сообщения: 124
Зарегистрирован: 30 сен 2017, 21:41
Имя: Тимур
Благодарил (а): 14 раз
Поблагодарили: 7 раз

Почему не работает

Сообщение Linkel »

irrWN писал(а): 23 янв 2020, 12:10
Linkel писал(а): 22 янв 2020, 19:02 этот код, только проверяет условие?что еще от него ждать
Ну да, простое условие, если данных много, переносим на следующую строку, если помещаются - то не переносим. Я просил помочь разобраться почему при переносе, у меня случается проблема описанная выше, в последнем абзаце.

Код: Выделить всё

	IF FIND('OTVET[j]','$N') > 0  THEN  // 
			IF LEN(OTVET[j])>=254 THEN
				j:=j+1;
			ELSE
				j:=0;
			END_IF
	END_IF
1)FIND('OTVET[j]','$N') > 0 так и должно быть, или оно эквивалентно == true? я просто на С+# привык)
2)ваш j заходит хоть в код, который перебирает индексы, или он не знает об изменение?
3)что будет если условие IF FIND('OTVET[j]','$N') > 0 будет ложно? есть else для него?в любом OTVET[j] есть хоть одна SN? т.е если в массиве OTVET[0/1/2] не будет знака SN, ваш блок j:=j+1; просто не выполнится и j=0, дальше остальные индексы мы не перебираем?
:ext_sleep:
Аватара пользователя

Автор темы
irrWN
здесь недавно
здесь недавно
Сообщения: 26
Зарегистрирован: 26 фев 2019, 12:12
Имя: Андрей
Благодарил (а): 5 раз

Почему не работает

Сообщение irrWN »

Linkel писал(а): 23 янв 2020, 18:31
irrWN писал(а): 23 янв 2020, 12:10
Linkel писал(а): 22 янв 2020, 19:02 этот код, только проверяет условие?что еще от него ждать
Ну да, простое условие, если данных много, переносим на следующую строку, если помещаются - то не переносим. Я просил помочь разобраться почему при переносе, у меня случается проблема описанная выше, в последнем абзаце.

Код: Выделить всё

	IF FIND('OTVET[j]','$N') > 0  THEN  // 
			IF LEN(OTVET[j])>=254 THEN
				j:=j+1;
			ELSE
				j:=0;
			END_IF
	END_IF
1)FIND('OTVET[j]','$N') > 0 так и должно быть, или оно эквивалентно == true? я просто на С+# привык)
2)ваш j заходит хоть в код, который перебирает индексы, или он не знает об изменение?
3)что будет если условие IF FIND('OTVET[j]','$N') > 0 будет ложно? есть else для него?в любом OTVET[j] есть хоть одна SN? т.е если в массиве OTVET[0/1/2] не будет знака SN, ваш блок j:=j+1; просто не выполнится и j=0, дальше остальные индексы мы не перебираем?
1)Я когда писал, ориентировался на то, что как только первый раз встречается $N сразу переносим на новую строку, до проверки длины самой строки. И только сейчас, благодаря Вам я заметил ошибку у себя, что если найден $N то нужно перенести, а у меня перед переносом проверка на длину, а после символа $N длина OBIS кода не может быть 255 символов, она гораздо короче.
2) Да, он в том же месте где и буфер считывается. Считался буфер (в свой массив) и сразу же начинается проверка и запись в массив.
3) Это невозможно, потому что в каждом элементе массива гарантировано встречается несколько раз символ $N.

Linkel
осмотрелся
осмотрелся
Сообщения: 124
Зарегистрирован: 30 сен 2017, 21:41
Имя: Тимур
Благодарил (а): 14 раз
Поблагодарили: 7 раз

Почему не работает

Сообщение Linkel »

irrWN писал(а): 24 янв 2020, 09:07
lol: все сложно, ладно, если разобрались, рад за вас.

Пс у вас с прибора приходят данные?а какой размер?
:ext_sleep:
Ответить

Вернуться в «Производство и технология»