<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Convert to Python to Codesys</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convert%2520to%2520Python%2520to%2520Codesys/</link><description>Recent changes to Convert to Python to Codesys</description><language>en</language><lastBuildDate>Sat, 07 Dec 2019 16:14:14 -0000</lastBuildDate><atom:link href="https://forge.codesys.com/drv/relay-pi-plate/wiki/Convert%20to%20Python%20to%20Codesys/feed" rel="self" type="application/rss+xml"></atom:link><item><title>Convert to Python to Codesys modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convert%2520to%2520Python%2520to%2520Codesys/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 16:14:14 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com698ab1a61b41d2e29fcff1aa3fc02e4794e785cf</guid></item><item><title>Convertion to Python to Codesys modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convertion%2520to%2520Python%2520to%2520Codesys/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v5
+++ v6
@@ -1,4 +1,4 @@
-Draft
+**Draft**

 The PI-Plate has manufactures devices that can be used with the Raspiberry-PI.  The objective of this project would not stop at just the relay plate, but also incorporate other Pi-Plate devices.  The Device driver will be a child of the SPI master and have 7 slots for Pi-Plate devices.  

@@ -182,15 +182,28 @@
             VAR_END

                IF bExecute Then
-               
+                           //Set frame GPIO
+                           //On_Output  //Not sure how to do this yet
+                           
+                           //Send 1 byte at a time
                           senddata(Data:= Data_Command[iStep]);
+                          
+                          //move to the next byte
                           iStep := iStep + 1;

+                          //if last byte then reset and indicate last data sent
                           if iStep = 7 Then
                               iStep := 0;
-                              Data_Sent := True;
+                              Data_Sent := True
+                              
+                              //Turn the output off
+                              //Not sure how to do this yet.
                           End_IF
-                
+                 Else
+                         //Reset Function if not executing
+                         iStep := 0;
+                         Data_Sent := False;
+                  End_If;

           Method sendData : BOOL;
           VAR_INPUT
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 16:02:50 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com8cec07198e8d9b1fe985a400104eb88f7362437a</guid></item><item><title>Convertion to Python to Codesys modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convertion%2520to%2520Python%2520to%2520Codesys/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v4
+++ v5
@@ -1,3 +1,5 @@
+Draft
+
 The PI-Plate has manufactures devices that can be used with the Raspiberry-PI.  The objective of this project would not stop at just the relay plate, but also incorporate other Pi-Plate devices.  The Device driver will be a child of the SPI master and have 7 slots for Pi-Plate devices.

 Pi-Plates
@@ -122,7 +124,7 @@
                     Previous_Relay_State : BOOL;
                     Previous_LED_State : BOOL;
                     Send_Data : BOOL;
-                    CommandData : ARRAY [0..8] OF BYTE;
+                    CommandData : ARRAY [0..6] OF BYTE;
             END_VAR


@@ -143,9 +145,9 @@
                                              60 = 0x3C;
                                             *)
                                             CommandData[0] := Relay_Base_Address + Relay_Plate_Address;
-                                            CommandData[1] := 16#0x13;
-                                            CommandData[2] := Relay_States;
-                                            CommandData[3] := 16#0x04;
+                                            CommandData[1] := 16#0x13;  //COMMAND FOR ALL RELAYS
+                                            CommandData[2] := Relay_States;  //CURRENT RELAY STATE MAP
+                                            CommandData[3] := 16#0x04;       //Don't know what the rest does
                                             CommandData[4] := 16#0x93;  
                                             CommandData[5] := 16#0xE0;
                                             CommandData[6] := 16#0x3C;
@@ -168,7 +170,27 @@
            Set_Leds :

            Function Write_Data
-    
+           VARINPUT
+               bExecute : BOOL;
+               Data_Command : ARRAY [0..6] OF BYTE;
+           END_VAR
+            VAR
+                        iStep : INT;
+            VAR_END
+            VAR OUTPUT
+                Data_Sent : BOOL;
+            VAR_END
+            
+               IF bExecute Then
+               
+                          senddata(Data:= Data_Command[iStep]);
+                          iStep := iStep + 1;
+                          
+                          if iStep = 7 Then
+                              iStep := 0;
+                              Data_Sent := True;
+                          End_IF
+                

           Method sendData : BOOL;
           VAR_INPUT
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 15:58:28 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comeec72a84f1a61577d9e20e3cee73377b585e1929</guid></item><item><title>Convertion to Python to Codesys modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convertion%2520to%2520Python%2520to%2520Codesys/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v3
+++ v4
@@ -167,10 +167,10 @@
                                         End_IF
            Set_Leds :

-            
-    
-    
-          Method Write_Data : BOOL;
+           Function Write_Data
+    
+    
+          Method sendData : BOOL;
           VAR_INPUT
               DATA : BYTE;
           END_VAR
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 15:48:18 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com1e98540d6253e0a97721919e99bc8f31ea530009</guid></item><item><title>Convertion to Python to Codesys modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convertion%2520to%2520Python%2520to%2520Codesys/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v2
+++ v3
@@ -121,18 +121,48 @@
             VAR
                     Previous_Relay_State : BOOL;
                     Previous_LED_State : BOOL;
-                    
+                    Send_Data : BOOL;
+                    CommandData : ARRAY [0..8] OF BYTE;
             END_VAR

+            
+            
+            Write_Data(Data:=CommandData,Execute:=Send_Data, Data_Sent =&amp;gt; DataSent);
+            
           Case of iState
+          
           Set_Relays: IF Previous_State &amp;lt;&amp;gt; Relay_States
-                                            Relays_Set:= Write_Data(Relay_Plate_Address,0x13,Relay_States,0,0);
-                                            Previous_State := Relay_States;
+                                            Send_Data := True;
+                                            (*Format: ppCMDr(addr,0x13,relays,0,0)
+                                                arg[0]=addr+RELAYbaseADDR;
+                                                           arg[1]=cmd;
+                                                           arg[2]=param1;
+                                                           arg[3]=param2;
+                                             null=spi.xfer(arg,300000,60)
+                                             300000 = 0x93E0;
+                                             60 = 0x3C;
+                                            *)
+                                            CommandData[0] := Relay_Base_Address + Relay_Plate_Address;
+                                            CommandData[1] := 16#0x13;
+                                            CommandData[2] := Relay_States;
+                                            CommandData[3] := 16#0x04;
+                                            CommandData[4] := 16#0x93;  
+                                            CommandData[5] := 16#0xE0;
+                                            CommandData[6] := 16#0x3C;
+                                            
+                                             If DataSent Then
+                                                 Relays_Set := true;
+                                                Send_Data := False;
+                                                Previous_State := Relay_States;
+                                             End_IF
+                                                 
                                         Else
                                             Relays_Set := true;
                                         End_IF

                                         If Relays_Set = True Then
+                                            Send_Data := False;
+                                            Previous_State := Relay_States;
                                             iState := Set_Leds;
                                         End_IF
            Set_Leds :
@@ -142,19 +172,17 @@

           Method Write_Data : BOOL;
           VAR_INPUT
-              Address : BYTE;
-              Command : BYTE;
-              Parameter_1 : WORD;
-              Parameter_2 : WORD;
+              DATA : BYTE;
           END_VAR
           VAR
             abyTxBuffer: ARRAY [0..2] OF BYTE;
             abyRxBuffer: ARRAY [0..2] OF BYTE;
+            
         END_VAR

-          abyTxBuffer[0] := Relay_Base_Address + SHL(byHardwareAddress, 1); //SPI_WRITE_CMD;
+          abyTxBuffer[0] := DATA; //SPI_WRITE_CMD;
           abyTxBuffer[1] := byPort;
-         abyTxBuffer[2] := byValue;
+          abyTxBuffer[2] := byValue;


  Write_Data := transfer(pabyTxBuffer:=ADR(abyTxBuffer) , pabyRxBuffer:=ADR(abyRxBuffer) , udiLen:=3 , uiDelayus:=5 );
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 15:46:41 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com828777335be3fb8d002f6bc2a789956684b57d98</guid></item><item><title>Convertion to Python to Codesys modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convertion%2520to%2520Python%2520to%2520Codesys/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -68,6 +68,27 @@
     assert ((relays&amp;gt;=0) and (relays&amp;lt;=127)),"Argument out of range. Must be between 0 and 127"
     ppCMDr(addr,0x13,relays,0,0)

+ def ppCMDr(addr,cmd,param1,param2,bytes2return):
+    global RELAYbaseADDR
+    arg = list(range(4))
+    resp = []
+    arg[0]=addr+RELAYbaseADDR;
+    arg[1]=cmd;
+    arg[2]=param1;
+    arg[3]=param2;
+    GPIO.output(ppFRAME,True)
+    null=spi.xfer(arg,300000,60)
+    #null = spi.writebytes(arg)
+    if bytes2return&amp;gt;0:
+        time.sleep(.0001)
+        for i in range(0,bytes2return):    
+            dummy=spi.xfer([00],500000,20)
+            resp.append(dummy[0])
+    time.sleep(.001)
+    GPIO.output(ppFRAME,False)
+    time.sleep(.001)
+    return resp   
+    
     **Codesys Code:**

    FB_Relay_Plate
@@ -83,7 +104,7 @@
     End

     VAR CONSTANT
-    Relay_Address_Offset : BYTE := 24;
+    Relay_Base_Address : BYTE := 24;
     Frame_GPIO : BYTE := 25;
     PPINT : BYTE := 22;  
     END_VAR
@@ -105,7 +126,7 @@

           Case of iState
           Set_Relays: IF Previous_State &amp;lt;&amp;gt; Relay_States
-                                            Relays_Set:=transfer(Relay_Plate_Address,0x13,Relay_States,0,0);
+                                            Relays_Set:= Write_Data(Relay_Plate_Address,0x13,Relay_States,0,0);
                                             Previous_State := Relay_States;
                                         Else
                                             Relays_Set := true;
@@ -115,11 +136,34 @@
                                             iState := Set_Leds;
                                         End_IF
            Set_Leds :
-          
-                
+                          
+            


-       
+          Method Write_Data : BOOL;
+          VAR_INPUT
+              Address : BYTE;
+              Command : BYTE;
+              Parameter_1 : WORD;
+              Parameter_2 : WORD;
+          END_VAR
+          VAR
+            abyTxBuffer: ARRAY [0..2] OF BYTE;
+            abyRxBuffer: ARRAY [0..2] OF BYTE;
+        END_VAR
+        
+          abyTxBuffer[0] := Relay_Base_Address + SHL(byHardwareAddress, 1); //SPI_WRITE_CMD;
+          abyTxBuffer[1] := byPort;
+         abyTxBuffer[2] := byValue;
+
+     
+ Write_Data := transfer(pabyTxBuffer:=ADR(abyTxBuffer) , pabyRxBuffer:=ADR(abyRxBuffer) , udiLen:=3 , uiDelayus:=5 );
+
+IF NOT Write_Data THEN
+   _iState := 1000;
+END_IF
+          
+          


 ~~~
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 14:33:00 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.comc90c885d709f8db80387f476194a3ad9a5a8d325</guid></item><item><title>Convertion to Python to Codesys modified by BG_Automation</title><link>https://forge.codesys.com/drv/relay-pi-plate/wiki/Convertion%2520to%2520Python%2520to%2520Codesys/</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;The PI-Plate has manufactures devices that can be used with the Raspiberry-PI.  The objective of this project would not stop at just the relay plate, but also incorporate other Pi-Plate devices.  The Device driver will be a child of the SPI master and have 7 slots for Pi-Plate devices.  &lt;/p&gt;
&lt;p&gt;Pi-Plates&lt;br/&gt;
Data Acquisition  Plate with Generator Capabilities&lt;br/&gt;
Data Acquisition Plate&lt;br/&gt;
Tinker Plate, Mix of Data Acquisition and inputs&lt;br/&gt;
Relay Control&lt;br/&gt;
Temperature Measurement&lt;br/&gt;
Motion Control&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pi-plates.com/pi-plates-catalog/" rel="nofollow"&gt;https://pi-plates.com/pi-plates-catalog/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The relay plate has 7 relays on the plate.  Looks like it is because of size and cost constraints.   Stacking the plates will allow for 49 relays.  Which is plenty for most projects and there is always the possibility of stringing together multiple Rasp-PIs via ethercat.   Each relay will be mapped to a variable so true will be on and false will be off.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RELAY Control Functions&lt;/strong&gt;&lt;br/&gt;
&lt;em&gt; relayON(addr,relay) - turns on (closes) the specified relay &lt;br/&gt;
&lt;/em&gt; relayOFF(addr,relay) - turns off (opens) the specified relay &lt;br/&gt;
&lt;em&gt; relayTOGGLE(addr,relay) - "toggles" state of specified relay. If relay is on, this command will turn it off. If relay is off, this command will turn it on. Use this command to blink a lamp off and on. &lt;br/&gt;
&lt;/em&gt; relayALL(addr,value) - used to control the state of all relays with a single command. "value" is a 7 bit number with each bit corresponding to a relay. Bit 0 is relay 1, bit 1 is relay 2, and so on. To turn all the relays on at once, use the number 127 for the value. &lt;br/&gt;
* relaySTATE(addr) - Returns a 7-bit number with the current state of each relay. Bit 0 is relay 1, bit 1 is relay 2, and so on. A "1" in a bit position means that the relay is on and zero means that it's off. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LED Control Functions&lt;/strong&gt;&lt;br/&gt;
&lt;em&gt; setLED(addr) - turn on the LED &lt;br/&gt;
&lt;/em&gt; clrLED(addr) - turn off the LED &lt;br/&gt;
* toggleLED(addr) - if LED is on, turn off. If LED is off, turn on. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;System Level Functions&lt;/strong&gt;&lt;br/&gt;
&lt;em&gt; getID(addr) - return Pi-Plate descriptor string&lt;br/&gt;
&lt;/em&gt; getFWrev(addr) - return FW revision in byte format&lt;br/&gt;
&lt;em&gt; getHWrev(addr) - return HW revision in byte format &lt;br/&gt;
&lt;/em&gt; getPMrev() - returns revision of python module &lt;br/&gt;
&lt;em&gt; getADDR(addr) - return address of pi-plate. Used for polling available boards at power up. &lt;br/&gt;
&lt;/em&gt; RESET(addr) - set RELAYplate to power-on state. Turns all relays off. **&lt;/p&gt;
&lt;p&gt;I am going to focus on &lt;br/&gt;
RelayAll&lt;br/&gt;
setLED&lt;br/&gt;
clrLED&lt;br/&gt;
getFWrev&lt;br/&gt;
getHWrev&lt;br/&gt;
RESET&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;Python Code&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;def&lt;/span&gt; &lt;span class="nv"&gt;getHWrev&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;:
    &lt;span class="nv"&gt;global&lt;/span&gt; &lt;span class="nv"&gt;RELAYbaseADDR&lt;/span&gt;
    &lt;span class="nv"&gt;VerifyADDR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ppCMDr&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x02&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;rev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;resp&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;]
    &lt;span class="nv"&gt;whole&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;float&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rev&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;point&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;float&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rev&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x0F&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;whole&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;point&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;  

&lt;span class="nv"&gt;def&lt;/span&gt; &lt;span class="nv"&gt;getFWrev&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;:
    &lt;span class="nv"&gt;global&lt;/span&gt; &lt;span class="nv"&gt;RELAYbaseADDR&lt;/span&gt;
    &lt;span class="nv"&gt;VerifyADDR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ppCMDr&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x03&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;rev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;resp&lt;/span&gt;[&lt;span class="mi"&gt;0&lt;/span&gt;]
    &lt;span class="nv"&gt;whole&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;float&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rev&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;point&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;float&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rev&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x0F&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;whole&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;point&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;

 &lt;span class="nv"&gt;def&lt;/span&gt; &lt;span class="nv"&gt;relayALL&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;,&lt;span class="nv"&gt;relays&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;:
    &lt;span class="nv"&gt;VerifyADDR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;assert&lt;/span&gt; &lt;span class="ss"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;relays&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;relays&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;,&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Argument out of range. Must be between 0 and 127&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nv"&gt;ppCMDr&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x13&lt;/span&gt;,&lt;span class="nv"&gt;relays&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;

    &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nv"&gt;Codesys&lt;/span&gt; &lt;span class="nv"&gt;Code&lt;/span&gt;:&lt;span class="o"&gt;**&lt;/span&gt;

   &lt;span class="nv"&gt;FB_Relay_Plate&lt;/span&gt;

   &lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;Globals&lt;/span&gt;
   &lt;span class="nv"&gt;Hardware_Version&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;Firmware_Version&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
   &lt;span class="nv"&gt;Relay_Plate_Address&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;  //0 to 7  Assigned by slot address?&lt;/span&gt;
   &lt;span class="nv"&gt;Relay_States&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;; //0 to 127, Bit 0 = Relay 0, Bit 7 = Relay 7&lt;/span&gt;
   &lt;span class="nv"&gt;Led_State&lt;/span&gt; : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;  //True = On, False = Off&lt;/span&gt;
   &lt;span class="nv"&gt;Previous_State&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;End&lt;/span&gt;

    &lt;span class="nv"&gt;VAR&lt;/span&gt; &lt;span class="nv"&gt;CONSTANT&lt;/span&gt;
    &lt;span class="nv"&gt;Relay_Address_Offset&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;Frame_GPIO&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;PPINT&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;;  &lt;/span&gt;
    &lt;span class="nv"&gt;END_VAR&lt;/span&gt;

   &lt;span class="nv"&gt;Intialize&lt;/span&gt;
       &lt;span class="nv"&gt;Method&lt;/span&gt; &lt;span class="nv"&gt;Set_Address&lt;/span&gt;
       &lt;span class="nv"&gt;Method&lt;/span&gt; &lt;span class="nv"&gt;Get_Hardware_Version&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
       &lt;span class="nv"&gt;Method&lt;/span&gt; &lt;span class="nv"&gt;Get_Firmware_Version&lt;/span&gt; : &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;


    &lt;span class="nv"&gt;Cyclic&lt;/span&gt; &lt;span class="nv"&gt;Calls&lt;/span&gt;

        &lt;span class="nv"&gt;METHOD&lt;/span&gt; &lt;span class="nv"&gt;Set_IO&lt;/span&gt;
            &lt;span class="nv"&gt;VAR&lt;/span&gt;
                    &lt;span class="nv"&gt;Previous_Relay_State&lt;/span&gt; : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                    &lt;span class="nv"&gt;Previous_LED_State&lt;/span&gt; : &lt;span class="nv"&gt;BOOL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

            &lt;span class="nv"&gt;END_VAR&lt;/span&gt;

          &lt;span class="nv"&gt;Case&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;iState&lt;/span&gt;
          &lt;span class="nv"&gt;Set_Relays&lt;/span&gt;: &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="nv"&gt;Previous_State&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Relay_States&lt;/span&gt;
                                            &lt;span class="nv"&gt;Relays_Set&lt;/span&gt;:&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;transfer&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Relay_Plate_Address&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x13&lt;/span&gt;,&lt;span class="nv"&gt;Relay_States&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;,&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                                            &lt;span class="nv"&gt;Previous_State&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Relay_States&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                                        &lt;span class="k"&gt;Else&lt;/span&gt;
                                            &lt;span class="nv"&gt;Relays_Set&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;true&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                                        &lt;span class="nv"&gt;End_IF&lt;/span&gt;

                                        &lt;span class="k"&gt;If&lt;/span&gt; &lt;span class="nv"&gt;Relays_Set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;True&lt;/span&gt; &lt;span class="k"&gt;Then&lt;/span&gt;
                                            &lt;span class="nv"&gt;iState&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Set_Leds&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
                                        &lt;span class="nv"&gt;End_IF&lt;/span&gt;
           &lt;span class="nv"&gt;Set_Leds&lt;/span&gt; :
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">BG_Automation</dc:creator><pubDate>Sat, 07 Dec 2019 14:24:14 -0000</pubDate><guid isPermaLink="false">https://forge.codesys.com97267b11f6eb7bc5816c9b4f8554756fd289f7af</guid></item></channel></rss>