# SCL Scripts Functionality Analysis *** ## Overview of Script Organization The project consists of several SCL scripts that manage different aspects of the Gateway and Motor-Box control system. Here's a breakdown of the main functional areas: 1. Data Conversion (002_FC, 101_FC) 2. Remote Control (003_FC, 100_FC) 3. System Configuration (004_FC, 020_FC, 021_FC) 4. Alarms Management (010_FC) 5. Operation Modes (030_FC, 032_FC, 035_FC, 036_FC) 6. HMI Interface (050_FC) Let's analyze each script in detail. ## Data Conversion Scripts *** ### 002_FC Data Read Conversion This script handles the reading of data from the ADI structures provided by the Gateway and converts it into a more usable format for the PLC program. **Key functions:** - Determines which Gateway is active based on mode (Auto or Manual) - Reads ADI_110 data to extract Gateway firmware and box communication status - Reads ADI_111 data to extract motor and box status information - Performs byte-by-byte data mapping including: - Motor status (forward/backward motion, alarms, position status) - Box status (firmware version, power issues) - Repeats the same process for Port 2 (ADI_120, ADI_121) if configured ### 101_FC Data Write Conversion This script converts the PLC program data format into the proper byte format required by the Gateway ADI structures for writing commands. **Key functions:** - Formats motor position commands into ADI_211 byte structure for each motor - Sets motor direction, position type, stop command, and reset flags - Configures current limits for both forward and reverse motion in ADI_212 - Repeats the same process for Port 2 (ADI_221, ADI_222) if configured ## Remote Control Scripts *** ### 003_FC Remote Control Read This script handles data transfer from the I/O controller (remote system) to the Gateway control system. **Key functions:** - Reads control word bits from the remote I/O controller - Reads lifecycle counter and bottle type information - Checks if local/remote selection is active and accordingly processes or ignores remote commands ### 100_FC Remote Control Write This script manages data transfer to the I/O controller, sending status information from the Gateway system. **Key functions:** - Updates status word bits based on system state (manual mode, changeover status, alarms) - Sends lifecycle counter, actual bottle type, and required bottle type - Transfers alarm list to remote system - Maps all data to appropriate I/O controller data locations ## System Configuration Scripts *** ### 004_FC Zone Activation A simple script that enables the four operational zones of the system. ### 020_FC Format Parameters This script manages format changes and recipe handling for different bottle types. **Key functions:** - Processes format selection requests (manual or from remote control) - Initiates and monitors recipe loading process - Transfers recipe data to zone parameters - Updates position offset information for each actuator ### 021_FC Area Parameters This script manages the assignment of actuators to operational zones. **Key functions:** - Checks actuator availability for zone configuration - Assigns actuators to zones in both zone parameters and motor parameters - Manages actuator configuration errors - Monitors zones that haven't completed format change - Checks if format change is complete across all zones ## Alarms Management *** ### 010_FC Alarms This is a comprehensive script handling all system alarms including: **Key functions:** - Box communication alarms for both ports - Burned fuse detection - Low voltage detection - Motor error monitoring - Gateway communication issues - Area configuration validation - Area-specific alarms - Safety module monitoring - Area timeout detection - Recipe loading errors The script uses various timers for alarm indication and implements a scrolling mechanism to highlight different alarms in sequence. ## Operation Modes Scripts *** ### 030_FC Aut_Man Selection This script manages the switching between automatic and manual modes. **Key functions:** - Processes local/remote selection input - Uses timers to implement mode switching delays - Sets the appropriate mode flags (Auto or Man) ### 032_FC Manual Function This script handles manual control of motors. **Key functions:** - Processes manual movement commands (forward, backward, zero/position) - Implements motor stop logic - Handles alarm reset functionality - Manages motor current limitation settings - Updates HMI with motor status information ### 035_FC Automatic Cycle This script implements the automatic cycle state machine for the format change process. **Key functions:** - Manages 13 states of the automatic cycle (from Manual to Clearing) - Handles transitions between states based on conditions - Processes external commands (reset, alarm, format change request) - Controls the zone state machine ### 036_FC Area Cycle This script manages the cycling through zones during format changes. **Key functions:** - Implements a 7-state zone state machine (from inactive to completion) - Calculates actuator positions based on bottle dimensions - Checks if actuators have reached their positions - Controls actuator commands (zero/position, forward/backward) - Manages manual movement of zones - Handles stop commands and alarm reset functionality ## HMI Interface *** ### 050_FC HMI This script handles the HMI (Human-Machine Interface) functionality. **Key functions:** - Controls lamp blinking for visual indicators - Updates HMI elements based on system state - Manages screen-specific elements for different HMI screens - Updates status LEDs for motors and boxes - Controls stackable light and buzzer based on system state ## Execution Flow *** The overall execution flow can be summarized as: 1. The system reads configuration from Gateway through data conversion (002_FC) 2. Based on mode (auto/manual), it either: - In Auto mode: Follows the automatic cycle (035_FC) and area cycle (036_FC) state machines - In Manual mode: Processes manual commands (032_FC) 3. Commands are sent to Gateway after conversion (101_FC) 4. Alarm conditions are continuously monitored (010_FC) 5. HMI is updated with status information (050_FC) 6. Remote control information is exchanged (003_FC, 100_FC) The system uses a combination of state machines, timers, and direct command processing to manage the format change process across multiple zones, ensuring actuators move to the correct positions based on bottle dimensions and configuration parameters. *** ### Motor Movement Command Flow Diagram *** This diagram shows how movement commands flow through the system from various input sources (HMI, Automatic Cycle, Remote Control) to the Gateway and ultimately to the motors. It highlights: - Different command sources - Processing through the manual and automatic functions - Data conversion for Gateway communication - The structure of movement commands, including the Zero/Position mode - Feedback flow of motor status information ```mermaid flowchart TD subgraph "Input Sources" HMI["HMI Commands\n(Manual Mode)"] AUT["Automatic Cycle\n(Auto Mode)"] RMT["Remote Control\n(External Commands)"] end subgraph "Command Processing" MAN_FUNC["FC032 Manual Function\n- Forward/Backward\n- Zero/Position\n- Stop\n- Reset Alarm"] AREA_CYC["FC036 Area Cycle\n- Automatic Zero/Position\n- Zone Movement\n- Position Calculation"] MOV_CMD["Movement Command Generation\n- Position Value\n- Direction\n- Mode\n- Stop/Reset"] end subgraph "Data Conversion" DATA_CONV["FC101 Data Write Conversion\n- Byte/Bit Formatting\n- ADI Structure Mapping"] end subgraph "Gateway Communication" ADI_211["ADI#211/ADI#221\n- Motor Commands Port 1/2"] ADI_212["ADI#212/ADI#222\n- Current Limits Port 1/2"] end subgraph "Feedback Processing" DATA_READ["FC002 Data Read Conversion\n- Status Interpretation"] ADI_111["ADI#111/ADI#121\n- Motor Status Port 1/2"] MOT_STATUS["Motor Status\n- InPosition\n- InZero\n- Moving\n- Alarm"] end %% Connections HMI --> MAN_FUNC AUT --> AREA_CYC RMT --> AREA_CYC MAN_FUNC --> MOV_CMD AREA_CYC --> MOV_CMD MOV_CMD --> DATA_CONV DATA_CONV --> ADI_211 DATA_CONV --> ADI_212 ADI_111 --> DATA_READ DATA_READ --> MOT_STATUS MOT_STATUS --> MAN_FUNC MOT_STATUS --> AREA_CYC %% Special Motor Commands Breakdown subgraph "Zero/Position Command Structure (Bit Layout)" ZP1["Position Value\n(12-bit value 0-4095)"] ZP2["Direction Sign\n(Bit 4: 1=+, 0=-)"] ZP3["Position Mode\n(Bit 5: 1=Zero then Position, 0=Relative)"] ZP4["Stop Motor\n(Bit 6: 1=Stop)"] ZP5["Reset Alarm\n(Bit 7: 1=Reset)"] end MOV_CMD -.-> ZP1 MOV_CMD -.-> ZP2 MOV_CMD -.-> ZP3 MOV_CMD -.-> ZP4 MOV_CMD -.-> ZP5 ``` ### Data Structures Flow Between Scripts *** This diagram illustrates how data flows between the different SCL scripts and data blocks in the system: - Shows all major data blocks (DB Gateway, DB Cycle, DB AreaPar, etc.) - Maps connections between functional blocks and data storage - Highlights key cross-function data flows - Identifies important data elements (ADI structures, motor status, commands) ```mermaid flowchart TD subgraph "Data Storage Blocks" DB_GW["DB Gateway\n- ADI Input/Output\n- Motor Box Control\n- Status Information"] DB_CYCLE["DB Cycle\n- Operation Mode\n- State Machines\n- Current Zone\n- Format Data"] DB_AREA["DB AreaPar\n- Zone Configuration\n- Motor Assignments\n- Position Settings"] DB_HMI["DB HMI\n- UI Parameters\n- User Selections\n- Status Display"] DB_MOTOR["DB MotorPar\n- Motor Enables\n- Current Limits\n- Zone Assignments"] DB_ALARMS["DB Alarms\n- Alarm Conditions\n- Error States\n- Diagnostic Info"] DB_FORMAT["DB FormatPar\n- Recipe Information\n- Format Settings\n- Bottle Parameters"] DB_REMOTE["DB Remote Control\n- External Commands\n- Status Reporting"] end subgraph "Data Flow Functions" FC002["FC002\nData Read Conversion"] FC003["FC003\nRemote Control Read"] FC010["FC010\nAlarms Management"] FC020["FC020\nFormat Parameters"] FC021["FC021\nArea Parameters"] FC030["FC030\nAut/Man Selection"] FC032["FC032\nManual Function"] FC035["FC035\nAutomatic Cycle"] FC036["FC036\nArea Cycle"] FC050["FC050\nHMI Interface"] FC100["FC100\nRemote Control Write"] FC101["FC101\nData Write Conversion"] end %% Primary Data Flows DB_GW <--> FC002 DB_GW <--> FC101 DB_CYCLE <--> FC035 DB_CYCLE <--> FC036 DB_AREA <--> FC021 DB_AREA <--> FC020 DB_AREA <--> FC036 DB_HMI <--> FC050 DB_HMI <--> FC032 DB_MOTOR <--> FC021 DB_MOTOR <--> FC032 DB_MOTOR <--> FC101 DB_ALARMS <--> FC010 DB_FORMAT <--> FC020 DB_REMOTE <--> FC003 DB_REMOTE <--> FC100 %% Cross-Function Data Flows FC002 --> FC010 FC002 --> FC032 FC002 --> FC036 FC002 --> FC050 FC003 --> FC035 FC020 --> FC036 FC030 --> FC035 FC032 --> FC101 FC035 --> FC036 FC036 --> FC101 FC050 --> FC032 FC010 --> FC100 %% Key Data Elements subgraph "Key Data Elements" ADI_IN["ADI Input Structures\n(110, 111, 120, 121)"] ADI_OUT["ADI Output Structures\n(211, 212, 221, 222)"] MOT_STAT["Motor Status\n(Position, Alarms, Movement)"] MOT_CMD["Motor Commands\n(Position, Direction, Mode)"] AREA_CONF["Area Configuration\n(Assignments, Parameters)"] BOT_PARAM["Bottle Parameters\n(Dimensions, Distances)"] ALARM_STAT["Alarm Status\n(Communication, Hardware)"] end ADI_IN -.-> DB_GW DB_GW -.-> ADI_OUT MOT_STAT -.-> DB_GW DB_GW -.-> MOT_CMD AREA_CONF -.-> DB_AREA BOT_PARAM -.-> DB_FORMAT ALARM_STAT -.-> DB_ALARMS ``` ### Motor Command Sequence Diagram *** This sequence diagram shows the exact flow of a motor command through the system: - Step-by-step process from command initiation to execution - Data conversion through FC101 - Command transmission through Gateway to Motor-Box - Status feedback loop through FC002 - Command termination and final status ```mermaid sequenceDiagram autonumber participant PLC as PLC Control Logic participant DBGateway as DB Gateway participant FC101 as FC101 Data Write Conversion participant Gateway as Gateway Device participant MotorBox as Motor-Box participant Motor as Actuator Motor participant FC002 as FC002 Data Read Conversion %% Command Generation Note over PLC: Movement request initiated PLC->>DBGateway: Set command parameters in<br>DB Gateway.N[g].write.P[p].MotorBoxCtrl[b].Mot[m] Note over PLC: Position value, PosType, Sign, Stop, Reset bits set %% Command Conversion & Formatting PLC->>FC101: Call data write conversion FC101->>DBGateway: Format command into ADI structure Note over FC101: Bit-by-bit mapping to ADI_211/221 FC101->>DBGateway: Map current limits to ADI_212/222 %% Command Transmission DBGateway->>Gateway: Transmit ADI_211/221 command bytes Gateway->>MotorBox: Forward command to target Motor-Box MotorBox->>Motor: Execute motor command %% Feedback Loop Motor->>MotorBox: Return status (moving, position, alarm) MotorBox->>Gateway: Send status data Gateway->>DBGateway: Update ADI_111/121 structures DBGateway->>FC002: Call data read conversion FC002->>DBGateway: Update status in structured format DBGateway->>PLC: Status available for program logic %% Command Termination alt In Position Reached PLC->>DBGateway: Clear command (detected from status) else Stop Requested PLC->>DBGateway: Send explicit stop command end %% Final Command Flow PLC->>FC101: Convert final command FC101->>DBGateway: Update ADI structure DBGateway->>Gateway: Transmit final command Gateway->>MotorBox: Forward to Motor-Box MotorBox->>Motor: Execute final command (stop) ``` ### Automatic Cycle and Zone State Machines *** This diagram illustrates the state machines that control automatic operation: - Automatic Cycle State Machine (FC035) with all 13 states - Zone State Machine (FC036) with 7 states - Manual Control Functions - Transitions between states and conditions that trigger them ```mermaid stateDiagram-v2 [*] --> Manual: System Start state "Automatic Cycle State Machine (FC035)" as AutoCycle { state "00 - Manual" as Auto00 state "01 - Stopped" as Auto01 state "02 - Resetting" as Auto02 state "03 - Idle" as Auto03 state "04 - Starting" as Auto04 state "05 - Execute" as Auto05 state "06 - Completing" as Auto06 state "07 - Complete" as Auto07 state "10 - Stopping" as Auto10 state "11 - Aborting" as Auto11 state "12 - Aborted" as Auto12 state "13 - Clearing" as Auto13 Auto00 --> Auto01 : Auto Mode Selected Auto01 --> Auto02 : Reset Pressed Auto02 --> Auto03 : No Area Alarms Auto03 --> Auto04 : Auto Start Delay Complete Auto04 --> Auto05 : Configure Initial Zone Auto05 --> Auto10 : Stop Request Auto05 --> Auto11 : Alarm Condition Auto05 --> Auto06 : All Zones Complete Auto06 --> Auto07 : Update Format Status Auto07 --> Auto01 : Reset Pressed Auto10 --> Auto01 : Zone Stopped Auto11 --> Auto12 : Zone Stopped Auto12 --> Auto01 : Reset Pressed Auto13 --> Auto01 : No Active Alarms } state "Zone State Machine (FC036)" as ZoneSM { state "00 - Disabled" as Zone00 state "01 - Format Change Required" as Zone01 state "02 - Initial Zone Assignment" as Zone02 state "03 - Load Positions" as Zone03 state "04 - Start Actuators" as Zone04 state "05 - Stop Actuators" as Zone05 state "06 - Zone Completion" as Zone06 Zone00 --> Zone01 : Format Changed Zone01 --> Zone02 : Auto Cycle Execute Zone02 --> Zone03 : Recipe Loaded Zone03 --> Zone04 : Positions Calculated Zone04 --> Zone05 : All Motors In Position Zone05 --> Zone06 : All Motors Stopped Zone06 --> Zone02 : More Zones To Process Zone06 --> Auto06 : All Zones Complete } state "Manual Control Functions (FC032)" as ManualFuncs { state "Forward/Backward Movement" as ManMove state "Zero/Position Command" as ManZero state "Stop Command" as ManStop state "Reset Alarm" as ManReset } Manual --> AutoCycle : Auto Mode AutoCycle --> Manual : Manual Mode Manual --> ManualFuncs : Manual Commands AutoCycle --> ZoneSM : Auto Cycle Execute ``` ### Command Data Structure Diagram *** This class diagram shows the detailed structure of command data: - Hierarchical organization of DB Gateway data - Structure of port, box, and motor specific information - Command and status data fields - Command structure interfaces showing bit layouts - Current limit structure with value definitions ```mermaid classDiagram class DBGateway { +Array[8] N[Gateway] } class Gateway { +Struct read +Struct write } class GatewayRead { +Array[2] P[Port] +Array[] ADI_110 +Array[] ADI_111 +Array[] ADI_120 +Array[] ADI_121 } class GatewayWrite { +Array[2] P[Port] +Array[] ADI_211 +Array[] ADI_212 +Array[] ADI_221 +Array[] ADI_222 } class PortRead { +USINT MboxNumber +USINT Firmware +Array[32] BoxCommunication[Box] +Array[32] MotorsBoxStatus[Box] } class PortWrite { +Array[32] MotorBoxCtrl[Box] } class MotorBoxStatus { +Array[8] MotorStatus[Motor] +Struct BoxStatus } class MotorStatus { +BOOL MovingFW +BOOL MovingBW +BOOL InPOS +BOOL Alarm +BOOL InZero +BOOL MovingSlowly +BOOL Reserved1 +BOOL Reserved2 } class BoxStatus { +USINT FirmwareVersion +USINT FirmwareRevision +BOOL BurnedFuse +BOOL Undervoltage } class MotorBoxCtrl { +Array[8] Mot[Motor] } class MotorCommand { +INT Position +BOOL Sign +BOOL PosType +BOOL Stop +BOOL Reset } DBGateway "1" *-- "8" Gateway Gateway "1" *-- "1" GatewayRead Gateway "1" *-- "1" GatewayWrite GatewayRead "1" *-- "2" PortRead GatewayWrite "1" *-- "2" PortWrite PortRead "1" *-- "32" MotorBoxStatus PortWrite "1" *-- "32" MotorBoxCtrl MotorBoxStatus "1" *-- "8" MotorStatus MotorBoxStatus "1" *-- "1" BoxStatus MotorBoxCtrl "1" *-- "8" MotorCommand %% ADI Structure notes class CommandStructure { <<Interface>> Position: 12-bit value (0-4095) Sign: 1=positive, 0=negative PosType: 1=Zero then Position, 0=Relative Stop: 1=stop motor, 0=continue movement Reset: 1=reset alarm, 0=normal operation } class CurrentLimitStructure { <<Interface>> Bits 0-2: Reverse current limit Bits 3-5: Forward current limit 000: 650mA (default) 001: 200mA 010: 300mA 011: 400mA 100: 500mA 101: 600mA 110: 700mA 111: 800mA } MotorCommand ..|> CommandStructure ```