0
Отвечен

тип String

lekoo 3 года назад в Редактор каналов обновлен СИМП Лайт (тех.поддержка) 3 года назад 12

При таком коде, каналы, в которые должны записываться названия ингредиентов постоянно "пролистываются", всегда отображается название последнего

Var   Strok: String;                                   //выбор раствора из выпадающего списка  

Jid1: String;                                     //переменная в которую записывается 1 ингредиент   

Jid2: String;                                     //переменная в которую записывается 2 ингредиент 

Begin  

 Strok:= ReadValue('Список растворов');  

 If Strok='1' then  

 Jid1:='Вода';  

 Jid2:='Ацетат свинца';   

WriteValue('1 жидкость',Jid1);   

WriteValue('2 жидкость',Jid2);  

 If Strok='2' then  

 Jid1:='Вода';  

 Jid2:='Сульфат алюминия';   

WriteValue('1 жидкость',Jid1);  

 WriteValue('2 жидкость',Jid2);  

 end. 

end

Если выбрать тип Jid1 и Jid2 Integer, и записать в них числа, то все работает как надо, а со строковыми не получается, при этом код одинаков в обоих случаях.В чем проблема?

На рассмотрении

День добрый.


Уточните задачу. Пришлите проект на simp@simplight.ru.

К сожалению проекта не осталось, я переписал все на С++, там все работает.
Но столкнулся с новой проблемой. Мне необходимо контролировать задержку открытия клапана, написал вот это

  double speed=ReadValue("скорость истечения жидкости");
  double konc=ReadValue("концентрация раствора");
  double massa=ReadValue("необходимая масса раствора");
  double i;
  double j;
  integer tv1;
  integer tx1;
  double koncn=konc/100;
  double speedv=speed*1000.0;
  double massav=massa*(1-koncn);
  double tv=massav/speedv;
  while (i!=tv) {i++; tv1++;};
  WriteValue("1 клапан",1);
  delay(tv1);
  WriteValue("1 клапан",0);
  double massax=massa*koncn;
  double tx=massax/speedv;
  while (i!=tx) {i++; tx1++;};
  WriteValue("3 клапан",1);
  delay(tx1);
  WriteValue("3 клапан",0);

}


А проблема в том, что если стоит знак "/"(как сейчас) то ничего не выполняется(наверное), при нажатии на кнопку "выполнить" в окне скрипта, оно даже не появляется, иногда моргнет на миллисекунду и все. А вот если эти 2 знака поменять на "*", то все прекрасно работает, только мне делить нужно, а не умножать. 
Если есть другой способ контролировать задержку, буду рад взять на вооружение. 

Забавно, если вместо
double tv=massav/speedv;

набрать
double tv=massav*(speedv^(-1));

то функция "выполнить" работает. Только вот не могу понять, почему так много насчитывает, должно считать по 2000(в задержку) примерно, а он миллионы считает, команда "выполнить" останавливается и пишет, что "таймаут времени выполнения, проверьте логику скрипта" . Не знаю в чем проблема, пробовал вместо While на for делать

 for (i=0; i!=tv; i++) {tv1=tv1+1;};

но получаю такой же результат

Я не специалист в программировании, поэтому был бы признателен узнать способ контролирования задержки, или функции, которая позволяла бы открывать клапан на рассчитанное(с помощью переменных) время, так как к примеру в этом проекте, масса раствора, концентрация и скорость истечения это не постоянные значения.

День добрый.


Попробуйте использовать функцию Delay(задержка в миллисекундах, true) 


Переменные tv1 и tx1 объявлены, но им не присвоено начальное значение.
При объявлении переменной она может иметь произвольное значение, так называемый "мусор памяти".

Поэтому необходимо перед использованием обнулить переменную:

tv1=0;

for (i=0; i!=tv; i++) {tv1=tv1+1;};

Изменил, как сказали, еще умножение на 1000 сделал после того как рассчитываем время

{
  double speed=ReadValue("скорость истечения жидкости");
  double konc=ReadValue("концентрация раствора");
  double massa=ReadValue("необходимая масса раствора");
  double i;
  double j;
  integer tv1=0;
  integer tx1=0;
  double koncn=konc/100;
  double massav=massa*(1.0-koncn);
  double tv=massav*(speed^(-1));
  double tvv=tv*1000.0;
  for (i=0; i!=tvv; i++) {tv1=tv1+1;};
  WriteValue("3 клапан",1);
  delay(tv1, true);
  WriteValue("3 клапан",0);
  double massax=massa*koncn;
  double tx=massax*(speed^(-1));
  double txx=tx*1000.0;
  for (j=0; j!=txx; j++) {tx1=tx1+1;};
  WriteValue("3 клапан",1);
  delay(tx1, true);
  WriteValue("3 клапан",0);
}


Вот скрин "выполнения"


Одно изменение есть, tv равно не -3000009.. а -120, ноя не понимаю, как при делении 20 на 5, получается -120...

и почему i такое огромное..


Всё дело в минусе.

Если переменная tvv принимает отрицательные значения, то цикл for (i=0; i!=tvv; i++) {tv1=tv1+1;}; не закончится никогда.

Значение переменной i принимает значение от 0 до положительной бесконечности, поэтому с каждой итерацией i всё дальше удаляется от значения переменной tvv.

Скрипт просто останавливается по истечении отведенного тайм аута.

С этим то все понятно, но вот откуда берется этот минус?
Если из степени (-1), то каким тогда образом мне делить эти 2 переменные? Если я ставлю знак / скрипт не выполняется, даже в "Выполнить" не зайти см. выше.

В С++ надо быть осторожней с операцией возведения в степень. Если набрать в поисковике фразу "c++ возведение в степень" то можно поразиться обилию ответов и вариантов.


Особенно при возведении в отрицательную степень, в этом случае общий алгоритм таков:


Для вычисления числа a-n в отрицательной степени нужно:

1.Вычислить an

2.Затем разделить 1 на полученный результат, т.е. 1/an


Я же уже несколько раз написал, что я не могу использовать знак делить, потому что в таком случае скрипт не выполняется.

Методом искоючения, проблема оказалась в переменной "speed", это пример с умножением, работает как надо.

Если же, поставить знак деления, то окно "выполнения" даже не открывается, просто моргнет и исчезнет.

Вообщем как оказывается вот так ничего поделить нельзя

{
  double b;
  double a;
  double c=a/b;
}

Каким тогда образом можно решить мою задачу?
А именно, мне необходимо открывать клапан на определенное время, которое будет зависеть от требуемой массы жидкости.

Чтобы знать на сколько его открыть, мне необходимо массу заданной жидкости разделить на скорость ее истечения. 

Значение необходимого кол-ва жидкости будет в форме ХХХ.Х, а скорость истечения ХХ.Х




Проблема решена, цикл for изменен, так как получались числа с огромным остатком и он не находил равные(не останавливался).


Вот конечный результат:
{

  double speed=ReadValue("123");
  double konc=ReadValue("345");
  double massa=ReadValue("567");
  double i;
  double j;
  integer tv1=0;
  integer tx1=0;
  double koncn=konc/100.0;
  double massav=massa*(1.0-koncn);
  double tv=massav/speed*1000.0;
  for (i=0; i<=tv; i++) {tv1++;};
  WriteValue("3 клапан",1);
  delay(tv1);
  WriteValue("3 клапан",0);

  double massax=massa*koncn;
  double tx=massax/speed*1000.0;
  for (j=0; j<=tx; j++) {tx1++;};
  WriteValue("1 клапан",1);
  delay(tx1);
  WriteValue("1 клапан",0);
}


Отладка не запускается, монитор работает как надо

Сервис поддержки клиентов работает на платформе UserEcho