ingangen optellen

De Modulaire PLC die vrijwel alles kan.

Moderator: GJ_

Plaats reactie
Tommie
Berichten: 6
Lid geworden op: 11-08-2014 07:02:30

ingangen optellen

Bericht door Tommie » 09-05-2017 22:14:17

Hallo,

ik zit met een vraagstuk:

ik wil graag tellen hoeveel ingangen/merkers hoog zijn van een bepaalde set.

stel ik kijk naar MB1, als .1 .3 en .5 hoog zijn wil ik dan bv een optelling doen waar 3 uitkomt.
ik heb al eens eens add_I en POS blokken geplaatst om zo de optelling te maken, en vervolgens in een volgend netwerk weer NEG en sub_I, maar door diverse factoren is dit niet de oplossing.
ik programmeer overigens in FBD/LAD, van STL heb ik nagenoeg geen weet :(

wie o wie kan mij opweg helpen ?
Als je altijd doet wat je altijd deed, krijg je wat je altijd kreeg.

JoopB
Berichten: 974
Lid geworden op: 30-11-2006 20:42:15
Locatie: Weert

Re: ingangen optellen

Bericht door JoopB » 13-05-2017 10:52:55

Hier een code waar je in een byte het aantal bits tel welke TRUE zijn. Dit is een code voor S7 classic . Met een kleine aanpassing werkt deze FC ook voor een Word of een DWord.
Het bye van de ingang wordt in een Temp DWord geschreven, dit DWord word met AND DWord met 1 verknoopt zodat alleen de waarde van het meest rechtse bit overblijft, is deze waarde gelijk aan 1 dan wordt de teller met 1 verhoogd , daarna word het Temp DWord 1 positie naar rechts verschoven als de waarde dan nog groter is dan 0 word bovenstaande herhaald tot de waarde gelijk aan 0 is dan wordt de tellerwaarde naar de Teller aan de output geschreven.
Door aan de INPUT het Byte formaat te wijzigen in een Word of een DWord formaat kun je deze functie ook toepassen op een Word of een DWord. Als je de functie b.v. aanpast voor een DWord kun je ook een byte testen maar dan moet je voor het aanroepen v/d FC Het Byte moven in een Temp DWord en dit DWord aan de Input van de FC hangen.
De code in STL source invoegen en dan deze Source Compilen (voor de Compile in je Symbool tabel een FC aanmaken met de Symbolische naam Count_True_Bits_in_Byte

Code: Selecteer alles

FUNCTION "Count_True_Bits_in_Byte" : VOID
TITLE =Aantal bits tellen welke hoog zijn in een byte
//Aantal bits tellen welke hoog zijn in een byte
//Eventueel Byte verandere naar Word of DWord
VERSION : 0.1


VAR_INPUT
  Te_TestenByte : BYTE ;	
END_VAR
VAR_OUTPUT
  AantalBit_1 : INT ;	
END_VAR
VAR_TEMP
  t_Teller : INT ;	
  T_TestInput : DINT ;	
  t_RechtsteBit : DINT ;	
END_VAR
BEGIN
NETWORK
TITLE =Teller op 0 
//Als er een woord getest moet worden te (Te_TestenByte   Byte) veranderen in Word
//Voor een DW in DWord (naam eventueel ook aanpassen
      A(    ; 
      L     0; 
      T     #t_Teller; 
      SET   ; 
      SAVE  ; 
      CLR   ; 
      A     BR; 
      )     ; 
      JNB   _001; 
      L     #Te_TestenByte; 
      T     #T_TestInput; 
_001: NOP   0; 
NETWORK
TITLE =
//AND DW met 1 zodat alleen het meest rechtse bit overblijft, als dit bit = 1 dan 
//teller met 1 verhogen
volg: A(    ; 
      L     #T_TestInput; 
      L     L#1; 
      AD    ; 
      T     #t_RechtsteBit; 
      SET   ; 
      SAVE  ; 
      CLR   ; 
      A     BR; 
      )     ; 
      A(    ; 
      L     #t_RechtsteBit; 
      L     L#1; 
      ==D   ; 
      )     ; 
      JNB   _002; 
      L     #t_Teller; 
      L     1; 
      +I    ; 
      T     #t_Teller; 
_002: NOP   0; 
NETWORK
TITLE =
//Input waarde 1 positie naar rechts schuiven (= delen door 2) zolang de waarde 
//groter is dan 0 een sprong naar vorige netwerk , anders normaal naar volgende 
//netwerk
      A(    ; 
      L     1; 
      L     #T_TestInput; 
      SRD   ; 
      T     #T_TestInput; 
      SET   ; 
      SAVE  ; 
      CLR   ; 
      A     BR; 
      )     ; 
      A(    ; 
      L     #T_TestInput; 
      L     L#0; 
      ==D   ; 
      )     ; 
      JCN   volg; 
NETWORK
TITLE =Test klaar waarde naar uitgang

      L     #t_Teller; 
      T     #AantalBit_1; 
      NOP   0; 
END_FUNCTION

MVG,
Joop

Plaats reactie

Terug naar “S7-300”