Hilfe für ANY-Neuling

Hallo Mecki,

warum willst Du eigendlich alles mit einem FC erschlagen bzw. neu erfinden.
Für die Umwandlung von PEW -> REAL gibt es den FC 105 und
für die Umwandlung von REAL -> PAW gibt es den FC 106.

Du findest sie in der Standard-Bibliothek bei den TI -> S7 Converting Blocks
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mecki,

warum willst Du eigendlich alles mit einem FC erschlagen bzw. neu erfinden.
Für die Umwandlung von PEW -> REAL gibt es den FC 105 und
für die Umwandlung von REAL -> PAW gibt es den FC 106.

Du findest sie in der Standard-Bibliothek bei den TI -> S7 Converting Blocks

Diese Bausteine habe ich auch schon gesehen. Ich bin nun gerade einmal seit einem Jahr fertig mit der Uni und nun quasi ins SPS-Programmieren reingerutscht. Nun ist es mein Ziel möglichst viel zu lernen und auch anzuwenden. Meine Idee war es nun eine Firmeninterne Bibliothek anzulegen, welche kleine FCs enthält, die dann alle hier benutzen können. Die FCs sollen kleine Programmteile abarbeiten (z.b. Analogwertverarbeitung), aber dennoch so umfangreich sein, dass man mit möglichst wenigen FCs, viele Probleme schnell lösen kann. Unser Hauptgeschäft liegt eigentlich nicht darin, Steuerungsprogramme zu schreiben, sodern eher in der Antriebstechnik.
 
muuuaaahahahaha :twisted: ...ich wußte, das geht nicht mit rechten dingen zu
 

Anhänge

  • muuuaaha.png
    muuuaaha.png
    2,2 KB · Aufrufe: 36
Zuviel Werbung?
-> Hier kostenlos registrieren
niemals, aber auch wirklich niemals will ich sowas in irgendeiner anlage vorfinden geschweigedenn einbauen:

Code:
*
FUNCTION "UN-&SCALE_ANY" : VOID
TITLE =
AUTHOR : '4lagig'
VERSION : 0.1


VAR_INPUT
  anyIn : ANY ;    
  bParameter : BYTE ;    
END_VAR
VAR_OUTPUT
  anyOut : ANY ;    
END_VAR
VAR_TEMP
  bTypIn : BYTE ;    
  bTypOut : BYTE ;    
  xScale : BOOL ;    
  xUnscale : BOOL ;    
  dTempAR1 : DWORD ;    
  dTempAR2 : DWORD ;    
  wDB1 : WORD ;    
  wDB2 : WORD ;    
  wInValue : WORD ;    
  rInValue : REAL ;    
  wOutValue : WORD ;    
  rOutValue : REAL ;    
  rScaleMax : REAL ;    
  rScaleMin : REAL ;    
  rDelta : REAL ;    
  xDB1 : BOOL ;    
  xDB2 : BOOL ;   
END_VAR
BEGIN
NETWORK
TITLE =
// --- Register retten
      TAR1  ; 
      T     #dTempAR1; 
      TAR2  ; 
      T     #dTempAR2; 
NETWORK
TITLE =
// --- Typprüfung
      L     P##anyIn; 
      LAR1  ; 
      L     P##anyOut; 
      LAR2  ; 
      L     B [AR1,P#1.0]; //Datentyp laden
      T     #bTypIn; 
      L     B [AR2,P#1.0]; 
      T     #bTypOut; 

      U(    ; 
      L     #bTypIn; 
      L     W#16#4; //ist WORD
      ==I   ; 
      )     ; 
      U(    ; 
      L     #bTypOut; 
      L     W#16#8; //ist REAL
      ==I   ; 
      )     ; 
      SPBN  nore; 
      =     #xScale; 
      R     #xUnscale; 
      SPA   db; 
nore: U(    ; 
      L     #bTypIn; 
      L     W#16#8; //ist REAL
      ==I   ; 
      )     ; 
      U(    ; 
      L     #bTypOut; 
      L     W#16#4; //ist WORD
      ==I   ; 
      )     ; 
      SPBN  err; 
      =     #xUnscale; 
      R     #xScale; 
NETWORK
TITLE =
// --- Datenbaustein?
db:   L     W [AR1,P#4.0]; 
      L     0; 
      <>I   ; 
      SPBN  db2; 
      TAK   ; 
      T     #wDB1; 
      SET   ; 
      =     #xDB1; 
      SPA   db3; 
db2:  CLR   ; 
      =     #xDB1; 
db3:  L     W [AR2,P#4.0]; 
      L     0; 
      <>I   ; 
      SPBN  db4; 
      TAK   ; 
      T     #wDB2; 
      SET   ; 
      =     #xDB2; 
      SPA   ver; 
db4:  CLR   ; 
      =     #xDB2; 
NETWORK
TITLE =
// --- Skalierung festlegen
ver:  L     #bParameter; 
      SPL   err1; 
      SPA   err1; 
      SPA   V0_1; 
      SPA   V1_1; 
      SPA   A0_2; 
      SPA   A4_2; 

err1: SPA   err; 
V0_1: L     0.000000e+000; //0..10V
      T     #rScaleMin; 
      L     1.000000e+001; 
      T     #rScaleMax; 
      SPA   ver1; 
V1_1: L     -1.000000e+001; //-10..10V
      T     #rScaleMin; 
      L     1.000000e+001; 
      T     #rScaleMax; 
      SPA   ver1; //0..20mA
A0_2: L     0.000000e+000; 
      T     #rScaleMin; 
      L     2.000000e+001; 
      T     #rScaleMax; 
      SPA   ver1; 
A4_2: L     4.000000e+000; //4..20mA
      T     #rScaleMin; 
      L     2.000000e+001; 
      T     #rScaleMax; 
      SPA   ver1; 
NETWORK
TITLE =
// --- Bearbeiten
ver1: L     D [AR1,P#6.0]; //Speicherbereich aus ANY
      LAR1  ; //in AR1
      L     D [AR2,P#6.0]; //Speicherbereich aus ANY
      LAR2  ; //in AR2
NETWORK
TITLE =
// --- SCALE
      U     #xScale; 
      SPBN  ver5; 

      U     #xDB1; 
      SPB   ver2; 
      L     W [AR1,P#0.0]; //auf IN-wert zugreifen
      T     #wInValue; 
      SPA   ver3; 
ver2: AUF   DB [#wDB1]; 
      L     DBW [AR1,P#0.0]; //auf IN-wert zugreifen
      T     #wInValue; 
ver3: L     L#32767; 
      <I    ; 
      SPBN  err; 
      L     #wInValue; 
      L     -1728; 
      >I    ; 
      SPBN  err; 

      L     #wInValue; 
      ITD   ; 
      DTR   ; 
      T     #rInValue; 
      L     #rScaleMax; 
      L     #rScaleMin; 
      -R    ; 
      L     #rInValue; 
      *R    ; 
      L     2.764800e+004; 
      /R    ; 
      L     #rScaleMin; 
      +R    ; 
      T     #rOutValue; 

      U     #xDB2; 
      SPB   ver4; 
      L     #rOutValue; 
      T     D [AR2,P#0.0]; 
      SPA   nerr; 
ver4: AUF   DB [#wDB2]; 
      L     #rOutValue; 
      T     DBD [AR2,P#0.0]; 
      SPA   nerr; 
NETWORK
TITLE =
// --- UNSCALE
ver5: U     #xUnscale; 
      SPBN  err; 
      U     #xDB1; 
      SPB   ver6; 
      L     D [AR1,P#0.0]; //auf IN-wert zugreifen
      T     #rInValue; 
      SPA   ver7; 
ver6: AUF   DB [#wDB1]; 
      L     DBD [AR1,P#0.0]; //auf IN-wert zugreifen
      T     #rInValue; 

ver7: L     #rScaleMax; 
      L     #rScaleMin; 
      -R    ; 
      T     #rDelta; 
      L     #rInValue; //der auszugebende Wert
      L     #rScaleMin; 
      -R    ; 
      L     #rDelta; 
      /R    ; 
      L     2.764800e+004; //Skalierungsfaktor
      *R    ; 
      RND   ; 
      T     #wOutValue; 

      U     #xDB2; 
      SPB   ver8; 
      L     #wOutValue; 
      T     W [AR2,P#0.0]; 
      SPA   nerr; 
ver8: AUF   DB [#wDB2]; 
      L     #wOutValue; 
      T     DBW [AR2,P#0.0]; 
      SPA   nerr; 
NETWORK
TITLE =
// --- Fehlerbehandlung
nerr: SET   ; 
      SAVE  ; 
      SPA   add; 
err:  CLR   ; 
      SAVE  ; 
add:  L     #dTempAR1; 
      LAR1  ; 
      L     #dTempAR2; 
      LAR2  ; 
END_FUNCTION
außer der kunde ist böse und hat es nicht anders verdient :rolleyes:

der is aber schön. schaut aus wie einer meiner bausteine. ich mache solche sachen oft. aber immer nur mit funktionen bei denen ich weis das sie nie und nimmer nachträglich geändert werden müssen. zb. wenn man ein bissl höhere mathematik braucht. auch für pufferverwaltungen und so sachen. der baustein wird getestet und dann gesperrt. der kunde hat sich für den code nicht zu interessieren. in solchen bausteinen fingert man nicht rum wenn man nicht genau weis was abgeht. wenn ein kop/fupler meint das is alles zu kompliziert dann soll er halt die finger davon lassen und weiter kop/fup 1000 netzwerk bausteine machen. ich schreib lieber smarten effektiven code. egal ob der service mann den dann versteht. macht man eh nur für bestimmte sich nicht ändernde funktionen. da muss den leuten der baustein kommentar dann reichen. jeder computerprogrammierer würde mich auslachen wenn ich sowas nicht so programmieren würde. am liebsten wärs mir ja wenn ich glech in c hacken könnt. für scl hatte ich leider noch nie die zeit den einstieg zu schaffen. das kommt aber noch. das hat schon was. klar für bit verknüpfungen isses scheiße. aber alles was datenverarbeitung angeht--> nur so!:ROFLMAO:
 
Meine Idee war es nun eine Firmeninterne Bibliothek anzulegen, welche kleine FCs enthält, die dann alle hier benutzen können. Die FCs sollen kleine Programmteile abarbeiten (z.b. Analogwertverarbeitung)

Wie wär's mit der OSCAT-Bibliothek?

OK, ich weiß, da ist nicht alles drin und auch nicht alles funzt immer einwandfrei, aber da kann man ja dran mitstricken.
 
Zuletzt bearbeitet:
oh das is cool. open source für plcs das kannte ich noch nicht. werd ich mir mal genauer ansehen.
open source rulez! nur freie codes können die menschheit weiter bringen. so wie der buchdruck die open source fürs geschriebene wort darstellte. take it to a higher level!
 
nein das siehst du falsch. der grund warum ich den baustein sperre ist der damit der service mitarbeiter der firma nicht in bausteinen rumfingert in denen er sich nicht auskennt. jeder der das know how hat meinen baustein zu verstehen weis auch wie man ihn entsperrt. es gibt halt leider viel zu viele möchtegern programmierer in diesem business. und die schütze ich dadurch vor sich selber. wenn ich die sourcen nicht hergeben ollte würde ich eine awl quelle machen und dann dem kunden nur die compilierten programmteile geben. ich weis schon was und warum ich etwas mache.
 
entschuldige, aber das mit der AWL-quelle versteh ich nicht ... du gibst deinem kunden dann also nur die cpu mit programm drauf, woraus er sich dann zwar was runterholen kann aber nicht so recht kommt?

oder meinst du eine SCL-quelle, die du dann nicht mit gibst?
 
nein aber so wie du in scl eine scl quelle schreibst kannst du ja auch eine awl quelle schreiben. also so wie du mit scl meinst halt nur mit ner awl quelle.

ja, ganz blöd bin ich ja auch nicht ... aber wenn du die bausteine übersetzt, hast du feinen AWL-code ... ich versteh den sinn der aktion noch nicht so ganz...
 
Zurück
Oben