回复:STL 语言中处理PIW的程序看不懂,请帮忙看看。

tomw

  • 帖子

    315
  • 精华

    0
  • 被关注

    18

论坛等级:侠士

注册时间:2013-05-08

普通 普通 如何晋级?

发布于 2017-08-04 08:27:57

2楼

展开查看
以下是引用question在2017-08-02 14:02:45的发言 >1楼

上面的程序图片看起来比较麻烦。我转换了文本。

FUNCTION "FECU_TYP_J" : VOID

TITLE =

//Istwerterfassung  FeCu Typ J

//                  maximale Messtellen = 16

//

//

//Datenschnittstelle:    FL_Takt          = Flanke Zeitnormal (100 ms)

//                       Mess_Zyklus      = Messung alle N Sekunden

//                       PEW_Start        = Adresse der AD-Baugruppe

//                       Istwert_DB       = Datenbaustein Istwerte

//                       Istw_DW_Start    = Start DW Istwerte

//                       Anzahl           = Anzahl der Messungen

//                       Offset_DB        = Datenbaustein Offsetwerte

//                       Offset_DW_Start  = Start DW Offsetwerte

//                       Fehler_DB        = Datenbaustein Fühlerbruch

//                       Fehler_DB_Start  = Start DB Fühlerbruch

//                       Fehler_Bit_Start = Start Bit Fühlerbruch

//     

{ S7_language := '7(1) Deutsch (Deutschland)  28.01.2016  09:38:44' }

AUTHOR : WDS

NAME : FeCu

VERSION : 0.1

 

 

VAR_INPUT

  FL_100mS : BOOL ;                     //Flanke Zeitnormal

  Mess_Zyklus : INT ;                       //Messung alle N Sekunden

  PEW_Start : INT ;                         //Adresse Peripheriewort

  Istwert_DB : BLOCK_DB ;           //Datenbaustein Istwerte

  Istw_DW_Start : INT ;               //Start DW Istwerte

  Anzahl : INT ;                                //Anzahl der Messungen

  Offset_DB : BLOCK_DB ;            //Datenbaustein Offsetwerte

  Offset_DW_Start : INT ;               //Start DW Offsetwerte

  Komp_Temp : INT ;                     //Temperatur der Vergleichsstelle

  Fehler_DB : BLOCK_DB ;            //Datenbaustein Fühlerbruch

  Fehler_Byte_Start : INT ;             //Start Byte Fühlerbruch

  Fehler_Bit_Start : INT ;              //Start Bit Fühlerbruch

  Freigabe_Pruef : BOOL ;           //Freigabe Fühlerbruchprüfung

END_VAR

VAR_IN_OUT

  C_MessZyklus : INT ;                  //Counter für Messzyklus

END_VAR

VAR_TEMP

  Anzahl_Messung_2 : INT ;          //Anzahl der Messungen * 2

  Index : INT ;                               //Index Z?hler

  Bit_Count : INT ;                         //Bitz?hler für Fühlerbruch

  Byte_Count : INT ;                    //Bytez?hler für Fühlerbruch

  AD_Wert : INT ;                       //AD Wert

  Pointer_Byte : INT ;                  //Pointer Byte Offset

  Pointer_Bit : INT ;                   //Pointer Bit Offset

END_VAR

BEGIN

NETWORK

TITLE =control intervall

 

      A     #FL_100mS;

      JNB   Ende;

 

// Z?hle Sekunden Takt

//--------------------------

      L     #C_MessZyklus;

      L     1;

      +I    ;

      T     #C_MessZyklus;

 

// Prüfe ob Zeit für neue Messung abgelaufen

//--------------------------------------------

      L     #Mess_Zyklus;

      >=I   ;

      JNB   Ende;

 

// neue Messung

//----------------------------

      L     0;

      T     #C_MessZyklus;

 

NETWORK

TITLE =Init.  FC

 

      L     #Anzahl;                                //Lese Anzahl der Messungen

      SLW   1;                                      //und multipliziere mit 2

      T     #Anzahl_Messung_2;

 

      L     0;

      T     #Index; //Index Counter = 0

 

      L     #Fehler_Bit_Start;                      //Start Byte Fühlerbruch

      T     #Pointer_Bit;

 

      L     #Fehler_Byte_Start;                 //Start Byte Fühlerbruch

//      T     #Pointer_Byte                         //test

 

// Wenn Messtellen > 8 dann erh?he Byte Adresse +1

// Wegen LSB MSB

//-------------------------------------------------

 

//      L     8                           //test

//      >I                                //test

//      SPBNB Loop                        //test

 

// Increment Start Byte

//--------------------------------------------------

//      TAK                               //test

      L     1;

      +I    ;

      T     #Pointer_Byte;

 

NETWORK

TITLE =calculate pointers

 

Loop: L     #PEW_Start;           //Pointer auf den Anfang des Peripheriewort

      L     #Index;                       //Lade Index Counter

      +I    ;                             //Berechne Adr. des Peripheriewortes

      ITD   ;                             //Integer -> double Integer

      SLD   3;                        //Konvertierung in's Pointerformat

      L     P#P  0.0;                 //Int. Pointer

      +D    ;                             //Bilde Pointeradr. Peripheriewort

      LAR1  ;                             //Lade Pointer in  Adressregister 1

 

NETWORK

TITLE =calculate analogue value

 

      L     W [AR1,P#0.0];                //Lese Analogwert

      ITD   ;

      DTR   ;                                     //A-D-Wert in Real

      L     1.000000e+000;            //Umrechnungsfaktor (1200,0 °C -> 12000 Einheiten)

      *R    ;                                     //Multipliziere

      RND   ;                                 //A-D Wert in Integer

      T     #AD_Wert;                     //sichere AD-Wert

 

NETWORK

TITLE =offset kompensation

 

      OPN   #Offset_DB;           //Offset DB ?ffnen

      L     #Index;                       //Lade Index Counter

      L     #Offset_DW_Start;    //Lade Offset Start Adresse

      +I    ;

      SLD   3;                            //Konvertierung in's Pointerformat

      LAR1  ;                             //Lade Pointer in  Adressregister

      L     DBW [AR1,P#0.0];     //Lese Offset Kanal (N)

      L     #AD_Wert;                 //Hole AD-Wert Kanal (N)

      +I    ;

      L     #Komp_Temp;           //Temp. Vergleichsstelle

      +I    ;

      T     #AD_Wert;                 //sichere AD-Wert

 

NETWORK

TITLE =write analogue value

 

      OPN   #Istwert_DB;          //Istwert DB ?ffnen

      L     #Index;                       //Lade Index Counter

      L     #Istw_DW_Start;       //Lade Iswert Start Adresse

      +I    ;

      SLD   3;                            //Konvertierung in's Pointerformat

      LAR1  ;                             //Lade Pointer in  Adressregister

      L     #AD_Wert;                 //Hole AD-Wert Kanal (N)

      T     DBW [AR1,P#0.0];     //schreibe AD-Wert -> Istwert DB,Kanal (N)

NETWORK

TITLE =calculate bit sensor broken

 

      L     #Pointer_Byte;        //Start Byte Fühlerbruch

      ITD   ;                             //Integer -> double Integer

      SLD   3;                            //Konvertierung in's Pointerformat

      L     #Pointer_Bit;             //Start Bit Fühlerbruch

      ITD   ;                             //Integer -> double Integer

      OD    ;                             //Addiere Bit Nr

      LAR1  ;                             //Lade Pointer in  Adressregister

 

NETWORK

TITLE =check if broken sensor

 

      OPN   #Fehler_DB;

      A     #Freigabe_Pruef;

      JC    Chk;                          //Bei Freigabe Prüfung

 

      A     DBX [AR1,P#0.0];

      R     DBX [AR1,P#0.0];     //Reset Fühlerbruch Bit (N)

      JU    Inc;

 

Chk:  L     #AD_Wert;             //Hole AD-Wert Kanal (N)

      L     30000;

      >I    ;

      =     DBX [AR1,P#0.0];         //Setze Fühlerbruch Bit (N)   

 

NETWORK

TITLE =

 

// Erhoehe Bit Adresse um 1

//-----------------------------

Inc:  L     #Pointer_Bit;             //Start Bit Fühlerbruch

      L     1;

      +I    ;

      T     #Pointer_Bit;

 

// Prüfe ob Bit Adresse > 7

//------------------------------

      L     7;

      >I    ;

      JCN   NW10;

 

// Setze MSB Byte

//-------------------------------

      L     0;

      T     #Pointer_Bit;

      L     #Pointer_Byte;

      L     1;

      -I    ;

      T     #Pointer_Byte;

 

NETWORK

TITLE =counter control

 

// Incrementiere Index Counter

//---------------------------------

NW10: L     #Index;

      L     2;

      +I    ;

      T     #Index;

 

// Prüfe auf Schleifen Ende

//----------------------------------

      L     #Anzahl_Messung_2;          //Wenn Index > Anzahl der Messungen

      >=I   ;                                       //dann Ende, sonst weiter

      JCN   Loop;

 

NETWORK

TITLE =programm end

 

Ende: NOP   0;

 

END_FUNCTION

 

黄色部分是有疑问的,这句是怎么处理PIW的?

还是第一次看德国人编写的逻辑程序。

确实,其功能很强大啊。

从逻辑程序可以看出,若要修改模拟量的标定值,无需修改程序,修改数据即可!


我怀疑德文版的间接寻址L W[AR1, P#0.0] 就相当于英文版的 L IW[AR1, P#0.0]。

不能确认,仅供参考!


Never study too hard to be foolish
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54617条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。