Conversion: SCL Simatic to Portal SCL

userxyz

Member
Join Date
May 2002
Location
any
Posts
2,768
This code is my standard FB for controlling a positioning axis from Lenze.
We are starting with Portal.
Is there a way to migrate this scl source to portal ?

Kind Regards,

C

Code:
FUNCTION_BLOCK FB840

VAR_INPUT 
PN_STAT_W: WORD; 
PN_SPD_ACT_W: WORD;
PN_POS_ACT_D: DWORD; 
PN_DRIVE_STAT_W: WORD; 
Mode_Auto: BOOL;    
Machine_Gestart: BOOL;  
Noodstop: BOOL; 
Deuren: BOOL;
Reset_Fault: BOOL; 
Safe_Motion_F: BOOL;
Safe_Motion_B: BOOL;
Man_F: BOOL;
Man_B: BOOL;
Manual_Fast: BOOL;
POS_SET: REAL;
SPEED_SET: REAL;
UNIT_SPEED_SET: REAL; 
FEED_CTE: REAL;
TIMER_EXEC: TIMER;
END_VAR   

VAR_IN_OUT
Start_Pos_ABS_F: BOOL;     
Start_Pos_ABS_B: BOOL;
Start_Pos_REL: BOOL;
Start_Homing: BOOL;
Pos_ABS_F_Done: BOOL;     
Pos_ABS_B_Done: BOOL;
Pos_REL_Done: BOOL;
END_VAR   

VAR_OUTPUT 
PN_CTRL_W: WORD;
PN_SPD_SET_W: WORD;
PN_POS_SET_D: DWORD;
POS_ACT: REAL;
HOME_DONE: BOOL;
RUNNING: BOOL;
FAULT: BOOL;
LIM_1_ACTIVE: BOOL;
LIM_2_ACTIVE: BOOL;
MANUAL_STATUS: INT;
END_VAR        

VAR_TEMP
Start_Flank: BOOL;    
Home_Flank: BOOL;
STAT_WORD: WORD;
STAT_DRIVE: WORD;
STATUSBITS AT STAT_WORD: STRUCT
IN_TARGET: BOOL;
PROFILE_BUSY: BOOL;
NC_2: BOOL;
TP_1: BOOL;
NC_3: BOOL;
NC_4: BOOL;
NC_5: BOOL;
QSTP: BOOL;
ERROR: BOOL;
HOME_DONE: BOOL;
PROFILE_DONE: BOOL;
INHIBITED: BOOL;
READY: BOOL;
LIM_1: BOOL;
LIM_2: BOOL;
NC_1: BOOL;
END_STRUCT;
DRIVESTATUSBITS AT STAT_DRIVE: STRUCT
Status_Code_bit_0: BOOL;    
Status_Code_bit_1: BOOL;
Status_Code_bit_2: BOOL;
Fault_Active: BOOL;
Warning: BOOL;
Trouble: BOOL;
Free_Statusbit_14: BOOL;
Free_Statusbit_15: BOOL;    
Free_Statusbit_0: BOOL;
Power_Disabled: BOOL;
Free_bit_2: BOOL;
Free_bit_3: BOOL;
Free_bit_4: BOOL;
Free_bit_5: BOOL;
Act_Spd_Zero: BOOL;
CInh: BOOL;
END_STRUCT;
TEMPVAR_REC_POS_DWORD: DWORD;
TEMPVAR_REC_POS_DINT: DINT;
END_VAR

VAR
CTRL_WORD: WORD;
CONTROLBITS AT CTRL_WORD: STRUCT
EXEC_PROF: BOOL;
ACTIVATE_SPD_OVERRIDE: BOOL;
SET_HOME_POS: BOOL;
FLT_RESET: BOOL;
JOG_NEG: BOOL;
JOG_POS: BOOL;
START_HOMING: BOOL;
NC_4: BOOL;
BRAKE_RELEASE: BOOL;
FINISH_TARGET: BOOL;
POS_STOP: BOOL;
CInh: BOOL;
PROF_1: BOOL;
PROF_2: BOOL;
PROF_4: BOOL;
PROF_8: BOOL;
END_STRUCT;
MEM_St: BOOL;
MEM_ho: BOOL;
REL_Busy: BOOL;
Homing_Busy: BOOL;
INTERRUPTED: BOOL;
DELAYED_EXEC_TIME: S5TIME;
EXEC: BOOL;
EXEC_DELAYED: BOOL;
END_VAR    
      
BEGIN

Start_Flank:= (Start_Pos_ABS_F OR Start_Pos_ABS_B OR Start_Pos_REL) AND (NOT MEM_St);
Home_Flank:= Start_homing AND (NOT MEM_ho);

STAT_WORD:= PN_STAT_W;
STAT_DRIVE:= PN_DRIVE_STAT_W;

// OPEN BRAKES
IF (((Machine_Gestart AND STATUSBITS.HOME_DONE AND Mode_Auto) OR ((Man_F AND Safe_Motion_F AND NOT Mode_Auto) OR (Man_B AND Safe_Motion_B AND NOT Mode_Auto))) AND NOT STATUSBITS.ERROR AND deuren AND noodstop) OR Start_Homing  THEN
    CONTROLBITS.BRAKE_RELEASE:= True; 
ELSE  
    CONTROLBITS.BRAKE_RELEASE:= False;  
END_IF;  


// FIXED BITS
CONTROLBITS.CInh:= FALSE; // CInh = Bit must be FALSE
IF Start_Homing THEN
    CONTROLBITS.ACTIVATE_SPD_OVERRIDE:= FALSE; // Speed Override
ELSE
    CONTROLBITS.ACTIVATE_SPD_OVERRIDE:= TRUE; // Speed Override
END_IF;  

// DIRECTS
HOME_DONE:= STATUSBITS.HOME_DONE; // Status voor de Machinereset       
IF (INT_TO_REAL(WORD_TO_INT(PN_SPD_ACT_W)) / 16384.0 * 100.0) > 2.0 THEN
    RUNNING:= TRUE;
ELSE
    RUNNING:= FALSE;    
END_IF;    


// MANUAL JOG
IF Man_F AND Safe_Motion_F AND NOT STATUSBITS.ERROR THEN
    CONTROLBITS.JOG_POS:= TRUE;
    CONTROLBITS.JOG_NEG:= FALSE;
ELSIF Man_B AND Safe_Motion_B AND NOT STATUSBITS.ERROR THEN
    CONTROLBITS.JOG_POS:= FALSE;
    CONTROLBITS.JOG_NEG:= TRUE;
ELSE
    CONTROLBITS.JOG_POS:= FALSE;
    CONTROLBITS.JOG_NEG:= FALSE;
END_IF; 


//FAULT HANDLING
FAULT:= STATUSBITS.ERROR;
CONTROLBITS.FLT_RESET:= Reset_Fault; 
LIM_1_ACTIVE:= STATUSBITS.LIM_1 AND NOT Start_homing;
LIM_2_ACTIVE:= STATUSBITS.LIM_2 AND NOT Start_homing;


// MANUAL STATUS VISU
IF (CONTROLBITS.JOG_POS OR CONTROLBITS.JOG_NEG) AND NOT Machine_Gestart AND NOT Mode_Auto AND NOT STATUSBITS.ERROR THEN
    MANUAL_STATUS:= 1;
ELSIF FAULT THEN
    MANUAL_STATUS:= 2;
ELSE
    MANUAL_STATUS:= 0;
END_IF;
            
 
// RESET STATUS
IF Start_Flank OR Home_Flank THEN
    Pos_REL_Done:= false;
    Pos_ABS_F_Done:= false;     
    Pos_ABS_B_Done:= false;
    REL_Busy:= false;
    Homing_Busy:= false;
    INTERRUPTED:= false;
END_IF; 
        
     
// POS REL // POS ABS // HOMING // CANCEL (EXECUTE PROFILE)
IF  Mode_Auto AND Safe_Motion_F AND Deuren AND Noodstop AND Machine_Gestart AND (Start_Pos_REL) AND NOT INTERRUPTED AND NOT STATUSBITS.ERROR THEN
     EXEC:= TRUE;
     CONTROLBITS.POS_STOP:= FALSE; 
ELSIF Mode_Auto AND NOT STATUSBITS.ERROR AND Deuren AND Noodstop AND Machine_Gestart AND STATUSBITS.HOME_DONE AND ((Start_Pos_ABS_F AND Safe_Motion_F) OR (Start_Pos_ABS_B AND Safe_Motion_B)) THEN
     EXEC:= TRUE; 
     CONTROLBITS.POS_STOP:= FALSE;
ELSIF Mode_Auto AND NOT STATUSBITS.ERROR AND Deuren AND Noodstop AND Start_Homing AND Safe_Motion_B THEN
    Start_Homing:= TRUE;
    EXEC:= TRUE;
    CONTROLBITS.POS_STOP:= FALSE;           
 ELSE
     EXEC:= FALSE;
     CONTROLBITS.POS_STOP:= TRUE;  
    IF Start_Pos_REL AND NOT STATUSBITS.IN_TARGET THEN
        INTERRUPTED:= TRUE;
        CONTROLBITS.FINISH_TARGET:= false;
    END_IF;             
END_IF;            

CONTROLBITS.SET_HOME_POS:= EXEC; // SET HOMEPOSITION

// FINISH RELATIVE PROFILE IF INTERRUPTED
IF INTERRUPTED AND Mode_Auto AND Safe_Motion_F AND NOT STATUSBITS.ERROR AND Deuren AND Noodstop AND Machine_Gestart AND (Start_Pos_REL) THEN
   CONTROLBITS.FINISH_TARGET:= true;
    CONTROLBITS.POS_STOP:= FALSE;
END_IF;
  
        
// PROFILE
IF Start_Homing THEN // Profiel 1 (HOMING)
    CONTROLBITS.PROF_1:= true;
    CONTROLBITS.PROF_2:= false;
    CONTROLBITS.PROF_4:= false;
    CONTROLBITS.PROF_8:= False; 
ELSIF Start_Pos_ABS_F THEN  // Profiel 3 (ABS FORWARD)
    CONTROLBITS.PROF_1:= true;
    CONTROLBITS.PROF_2:= true;
    CONTROLBITS.PROF_4:= false;
    CONTROLBITS.PROF_8:= False; 
ELSIF Start_Pos_ABS_B THEN // Profiel 4 (ABS BACKWARD)
    CONTROLBITS.PROF_1:= false;
    CONTROLBITS.PROF_2:= false;
    CONTROLBITS.PROF_4:= true;
    CONTROLBITS.PROF_8:= False; 
ELSIF Start_Pos_REL  THEN // Profiel 5 (REL)
    CONTROLBITS.PROF_1:= true;
    CONTROLBITS.PROF_2:= false;
    CONTROLBITS.PROF_4:= true;
    CONTROLBITS.PROF_8:= False;     
END_IF;    


// HOME DONE
IF  Start_Homing AND STATUSBITS.PROFILE_BUSY THEN
    Homing_Busy:= TRUE;
END_IF;
IF  (Homing_Busy AND NOT STATUSBITS.PROFILE_BUSY AND Start_Homing AND STATUSBITS.HOME_DONE) OR NOT Mode_Auto THEN  
    Start_Homing:= false;
    Homing_Busy:= false;
END_IF;


// ABS F POS DONE
IF  NOT STATUSBITS.PROFILE_BUSY AND Start_Pos_ABS_F AND POS_SET <= POS_ACT + 0.5 AND POS_SET >= POS_ACT - 0.5 AND STATUSBITS.IN_TARGET AND STATUSBITS.PROFILE_DONE THEN   
    Pos_ABS_F_Done:= True;
    Start_Pos_ABS_F:= False; 
END_IF;


// ABS B POS DONE
IF  NOT STATUSBITS.PROFILE_BUSY AND Start_Pos_ABS_B AND POS_SET <= POS_ACT + 0.5 AND POS_SET >= POS_ACT - 0.5 AND STATUSBITS.IN_TARGET AND STATUSBITS.PROFILE_DONE THEN   
    Pos_ABS_B_Done:= True;
    Start_Pos_ABS_B:= False;   
END_IF;


// REL POS DONE
IF  Start_Pos_REL AND STATUSBITS.PROFILE_BUSY AND NOT INTERRUPTED THEN
    REL_Busy:= TRUE;
END_IF;
IF  REL_Busy AND NOT STATUSBITS.PROFILE_BUSY AND Start_Pos_REL AND STATUSBITS.IN_TARGET AND STATUSBITS.PROFILE_DONE THEN  
    Pos_REL_Done:= True;
    Start_Pos_REL:= False;
    REL_Busy:= false;
    INTERRUPTED:= FALSE;
    CONTROLBITS.FINISH_TARGET:= FALSE;
END_IF;


// SEND POSITION
PN_POS_SET_D := ROL (
IN := DINT_TO_DWORD(ROUND(POS_SET * FEED_CTE)), 
N := 16) ;


// RECEIVE POSITION
TEMPVAR_REC_POS_DWORD := ROL (
IN := PN_POS_ACT_D, 
N := 16) ;
TEMPVAR_REC_POS_DINT:= DWORD_TO_DINT(TEMPVAR_REC_POS_DWORD);
POS_ACT:= DINT_TO_REAL(TEMPVAR_REC_POS_DINT) / FEED_CTE;;


// SPEED LIMITATION
IF SPEED_SET >= 100.0 THEN
    SPEED_SET:= 100.0;
END_IF;
IF SPEED_SET <= 0.0 THEN
    SPEED_SET:= 0.0;
END_IF;


// SEND SPEED
IF NOT Mode_Auto AND Manual_Fast THEN
    PN_SPD_SET_W:= 8190;
ELSIF NOT Mode_Auto AND NOT Manual_Fast THEN
    PN_SPD_SET_W:= 4096;
ELSE
    PN_SPD_SET_W:= DINT_TO_WORD(ROUND(SPEED_SET * (UNIT_SPEED_SET / 100.0) / 100.0 * 16384.0));    
END_IF;


IF NOT Mode_Auto AND NOT Machine_Gestart THEN
    CONTROLBITS.PROF_1:= false;
    CONTROLBITS.PROF_2:= true;
    CONTROLBITS.PROF_4:= false;
    CONTROLBITS.PROF_8:= False;
END_IF;


DELAYED_EXEC_TIME := S_ODT (T_NO:= TIMER_EXEC, S:=EXEC, TV:=T#100ms, R:=FALSE, Q:=EXEC_DELAYED);
CONTROLBITS.EXEC_PROF:= EXEC_DELAYED;
   

PN_CTRL_W:= CTRL_WORD;

MEM_St:= (Start_Pos_REL OR Start_Pos_ABS_F OR Start_Pos_ABS_B);    
MEM_Ho:= Start_Homing;   
    
END_FUNCTION_BLOCK
 
There are a few differences between SCL in Portal vs Simatic Manager, but they are extremely similar.

There are two ways that I think should work to get the code in, although you may need to massage it slightly before it will compile.


  1. If you want just this one block, Export it as an SCL source file, and then import that under "External source files" in the project tree.
  2. Migrate the whole project. It should bring all the code in with it. There are some requirements for this, including the blocks all being unlocked, and the project being consistent (use the block consistency check).
 
Bring the SCL in

Hi, Thanks for your reply,

Ik made a source of it and placed it under external source file. But what now ?

Thanks,
C

There are a few differences between SCL in Portal vs Simatic Manager, but they are extremely similar.

There are two ways that I think should work to get the code in, although you may need to massage it slightly before it will compile.


  1. If you want just this one block, Export it as an SCL source file, and then import that under "External source files" in the project tree.
  2. Migrate the whole project. It should bring all the code in with it. There are some requirements for this, including the blocks all being unlocked, and the project being consistent (use the block consistency check).
 
I think it explodes on this:

STATUSBITS AT STAT_WORD: STRUCT
IN_TARGET: BOOL;
PROFILE_BUSY: BOOL;
NC_2: BOOL;
TP_1: BOOL;
NC_3: BOOL;
NC_4: BOOL;
NC_5: BOOL;
QSTP: BOOL;
ERROR: BOOL;
HOME_DONE: BOOL;
PROFILE_DONE: BOOL;
INHIBITED: BOOL;
READY: BOOL;
LIM_1: BOOL;
LIM_2: BOOL;
NC_1: BOOL;
END_STRUCT;

Date type AT construct is not allowed, any idea how I can replace this in the new software in a simple way ?
 
In Step 7 v5.5 create a project, (say CBO) and insert a program into it.
Copy your SCL block into the project. Compile the SCL.

In TIA, migrate the CBO project into TIA. Close the project. Open the TIA project with your chosen CPU (I used a CPU1517). Open the CBO project as a reference project. Copy FB840 from the reference project into your CPU project. Compile the software - it will fail as TIA SCL has gone back to using s5time values for s5 timers. See below for correction.
Code:
#DELAYED_EXEC_TIME := S_ODT (T_NO:= #TIMER_EXEC, S:=#EXEC, TV:=[B][COLOR=Red]s5t#100ms[/COLOR][/B], R:=FALSE, Q=>#EXEC_DELAYED);
 
I think it explodes on this:

STATUSBITS AT STAT_WORD: STRUCT
IN_TARGET: BOOL;
PROFILE_BUSY: BOOL;
NC_2: BOOL;
TP_1: BOOL;
NC_3: BOOL;
NC_4: BOOL;
NC_5: BOOL;
QSTP: BOOL;
ERROR: BOOL;
HOME_DONE: BOOL;
PROFILE_DONE: BOOL;
INHIBITED: BOOL;
READY: BOOL;
LIM_1: BOOL;
LIM_2: BOOL;
NC_1: BOOL;
END_STRUCT;

Date type AT construct is not allowed, any idea how I can replace this in the new software in a simple way ?

This is a fixable issue; I'm surprised I've never seen it before. The difference is that in Portal you need to declare the AT immediately after the the tag you want to access is declared.

The easiest way to fix this is to re-order the SCL source so that it matches what portal expects.

Code:
STAT_WORD: WORD;
STAT_DRIVE: WORD;
STATUSBITS AT STAT_WORD: STRUCT
IN_TARGET: BOOL;
PROFILE_BUSY: BOOL;
NC_2: BOOL;
TP_1: BOOL;
NC_3: BOOL;
NC_4: BOOL;
NC_5: BOOL;
QSTP: BOOL;
ERROR: BOOL;
HOME_DONE: BOOL;
PROFILE_DONE: BOOL;
INHIBITED: BOOL;
READY: BOOL;
LIM_1: BOOL;
LIM_2: BOOL;
NC_1: BOOL;
END_STRUCT;
DRIVESTATUSBITS AT STAT_DRIVE: STRUCT
Status_Code_bit_0: BOOL;    
Status_Code_bit_1: BOOL;
Status_Code_bit_2: BOOL;
Fault_Active: BOOL;
Warning: BOOL;
Trouble: BOOL;
Free_Statusbit_14: BOOL;
Free_Statusbit_15: BOOL;    
Free_Statusbit_0: BOOL;
Power_Disabled: BOOL;
Free_bit_2: BOOL;
Free_bit_3: BOOL;
Free_bit_4: BOOL;
Free_bit_5: BOOL;
Act_Spd_Zero: BOOL;
CInh: BOOL;
Change it to:

Code:
STAT_WORD: WORD;
STATUSBITS AT STAT_WORD: STRUCT
IN_TARGET: BOOL;
PROFILE_BUSY: BOOL;
NC_2: BOOL;
TP_1: BOOL;
NC_3: BOOL;
NC_4: BOOL;
NC_5: BOOL;
QSTP: BOOL;
ERROR: BOOL;
HOME_DONE: BOOL;
PROFILE_DONE: BOOL;
INHIBITED: BOOL;
READY: BOOL;
LIM_1: BOOL;
LIM_2: BOOL;
NC_1: BOOL;
END_STRUCT;
[highlight="Yellow"]STAT_DRIVE: WORD;[/highlight]
DRIVESTATUSBITS AT STAT_DRIVE: STRUCT
Status_Code_bit_0: BOOL;    
Status_Code_bit_1: BOOL;
Status_Code_bit_2: BOOL;
Fault_Active: BOOL;
Warning: BOOL;
Trouble: BOOL;
Free_Statusbit_14: BOOL;
Free_Statusbit_15: BOOL;    
Free_Statusbit_0: BOOL;
Power_Disabled: BOOL;
Free_bit_2: BOOL;
Free_bit_3: BOOL;
Free_bit_4: BOOL;
Free_bit_5: BOOL;
Act_Spd_Zero: BOOL;
CInh: BOOL;
You can also fix this in portal, by rearranging the tags and then redeclaring them. It probably shows up now as the data type is "AT construct", highlighted in red/pink. Copy this to the line to the correct place (below the tag it overlays), then change the data type to AT. Now it should say AT "Tag name in line above" at the end of the tag name. If you now add the desired data type, it should take away the error.
 

Similar Topics

I have a machine which is undergoing upgradation. As part of the process two SEW drives are being replaced., existing Gen B with new Gen C. The...
Replies
3
Views
191
Currently I’m using ESA model VT155W0000 HMI and it’s communicate with Fanuc PLC. Can any one suggest can I convert ESA model to EXOR HMI eSMART07M
Replies
0
Views
83
hi... i have an issue in s7 300 plc, while we run the machine(in idle there is no fault) , plc cpu goes in SF mode, after restart the power cycle...
Replies
2
Views
116
I have a Type C to RS485 adapter connect to my Siemens RWF55. I use modscan to scan it to get a value from the Siemens controller. In the...
Replies
4
Views
100
Hi all, I'm in the process of upgrading a PanelView1200 HMI program to be developed in FactroyTalk View Studio. The filetype for PanelView 1200...
Replies
7
Views
277
Back
Top Bottom