не работает простейший алгоритм. в чем проблема? (STL)

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
stargazer
Posts: 7
Joined: Mon Dec 24, 2007 11:48 am
Location: Russia

не работает простейший алгоритм. в чем проблема? (STL)

Post by stargazer » Mon Dec 24, 2007 11:59 am

вот такая штука. проверяет введенное значение - должно быть от 0 до 100.

вроде бы просто, но в эмуляции выдает галиматью..

Code: Select all

// 
// проверка введенного значения  
// 
      L     DB50.DBW0               // должно быть не меньше нуля
      L     0.000000e+000
      >=R   
      JC    CH1
      L     0.000000e+000
      T     DB50.DBW0   // если меньше, то 0
CH1:  CLR   
//  
//  проверка введенного значения  
// 
      L    DB50.DBW0        //должно быть не больше 100
      L     1.000000e+002
      <=R   
      JC    CH2
      L     1.000000e+002
      T     DB50.DBW0     // если больше, то 100
CH2:  CLR   
где я облажался?

slawa123
Posts: 22
Joined: Fri Jan 12, 2007 2:45 pm
Location: Kazakhstan

Post by slawa123 » Mon Dec 24, 2007 1:47 pm

Должно работать ,если у тебя в DBW0 дейстительно число с плавающей запятой ,а если вдруг целое -будет галиматья

VadVik
Posts: 21
Joined: Mon Jan 22, 2007 12:30 pm
Location: Ukraine

Post by VadVik » Mon Dec 24, 2007 1:54 pm

Дело в том, что адресация DBW число integer, word. Ты используешь сравнение с типом Real, естественно работать не будет. Необходимо DBW заменить на DBD

stargazer
Posts: 7
Joined: Mon Dec 24, 2007 11:48 am
Location: Russia

Post by stargazer » Mon Dec 24, 2007 3:02 pm

точно, с типом данных облажался..
собсно, мне и не нужно число с плав. точкой. достаточно integer
но и так тоже галиматья...

Code: Select all

// 
// проверка введенного значения  
// 
      L     DB50.DBW0               // должно быть не меньше нуля 
      L     0 
      >=I    
      JC    CH1 
      L     0 
      T     DB50.DBW0   // если меньше, то 0 
CH1:  CLR    
//  
//  проверка введенного значения  
// 
      L    DB50.DBW0        //должно быть не больше 100 
      L     100 
      <=I    
      JC    CH2 
      L     100 
      T     DB50.DBW0     // если больше, то 100 
CH2:  CLR   

sania
Site Admin
Posts: 1371
Joined: Sat Aug 13, 2005 6:15 am

Post by sania » Mon Dec 24, 2007 3:46 pm

и правильно....
ты делаешь
JC CH1
а откуда он возмёт RLO?????
нужно сделать присвоение,сделай темп переменную

Code: Select all

= #Temp_Bit
А #Temp_Bit
JC    CH1
P.S.по докам:операции с регистрами НЕ изменяют RLO

VadVik
Posts: 21
Joined: Mon Jan 22, 2007 12:30 pm
Location: Ukraine

Post by VadVik » Tue Dec 25, 2007 6:29 am

Я проверил твой код немного изменив значения присвоения:

// проверка введенного значения

Code: Select all

      L     MW  1000                    // должно быть не меньше нуля
      L     0
      >=I   
      JC    CH1
      L     0
      T     MW  1000                    // если меньше, то 0

CH1:  CLR 

//
// проверка введенного значения

Code: Select all

      L     MW  1000                    //должно быть не больше 100
      L     100
      <=I   
      JC    CH2
      L     100
      T     MW  1000                    // если больше, то 100
CH2:  CLR

У меня все работает при вводе значения 110 в MW1000 соотвественно записывается 100, при вводе -8 в MW1000 - 0
Что касательно RLO то в данном случаи нет необходимости использовать временные переменные.

stargazer
Posts: 7
Joined: Mon Dec 24, 2007 11:48 am
Location: Russia

Post by stargazer » Tue Dec 25, 2007 8:28 am

2VadVik
чудеса...
после вашего ответа я проверил еще раз и все заработало.

Спасибо!