[Scilab-users] Creating C function blocks in scilab 5.5.2

Steve stepan.podhorsky at gmail.com
Mon Aug 12 08:28:46 CEST 2019


Hello,

I have been using scilab version 5.5.2 (64 bit) under Windows 7 (64 bit).
For current project I need to be able to create xcos blocks wich behavior
is prescribed by my own C language source code. I have found following
excellent tutorial  https://www.scicos.org/ScicosCBlockTutorial.pdf
<https://www.scicos.org/ScicosCBlockTutorial.pdf>  .

At first I have installed the MinGw toolbox 0.9.3. The installation seems 
to be successful because the function haveacompiler returns true. Then I
have written the source code according to the above mentioned tutorial

// This is the computational function for a scicos model block.
    // The model is of a variable-gain integrator with hard high and low
limits.
    
        #include "c:\Program
Files\scilab-5.5.2\modules\scicos_blocks\includes\scicos_block4.h"
        #include <math.h>
        #include <stdio.h>
        #include <stdlib.h>
        
        #define r_IN(n, i) 	((GetRealInPortPtrs(blk, n+1))[(i)])
        #define r_OUT(n, i)	((GetRealOutPortPtrs(blk, n+1))[(i)])
        
        // parameters
        #define Lhi	(GetRparPtrs(blk)[0])	// integrator high limit
        #define Llo	(GetRparPtrs(blk)[1])	// integrator low limit
        
        // inputs
        #define in	(r_IN(0,0))	// integrator input
        #define gainp	(r_IN(1,0))	// integrator gain when x > 0
        #define gainn	(r_IN(2,0))	// integrator gain when x <= 0
        
        // states
        #define X	(GetState(blk)[0])	// integrator state
        #define Xdot	(GetDerState(blk)[0])	// derivative of the integrator
output
        
        // outputs
        #define out	(r_OUT(0,0))	// integrator output
        #define Igain   (r_OUT(1,0))	// integrator gain
        
        // other constants
        #define surf0	(GetGPtrs(blk)[0])
        #define surf1	(GetGPtrs(blk)[1])
        #define surf2	(GetGPtrs(blk)[2])
        #define mode0	(GetModePtrs(blk)[0])
        
        // if X is greater than Lhi, then mode is 1
        // if X is between Lhi and zero, then mode is 2
        // if X is between zero and Llo, then mode is 3
        // if X is less than Llo, then mode is 4
        #define mode_xhzl	1
        #define mode_hxzl	2
        #define mode_hzxl	3
        #define mode_hzlx	4
        
        void lim_int(scicos_block *blk, int flag)
        {
        	double gain = 0;
        
        	switch(flag)
        	{
        		case 0:
        			// compute the derivative of the continuous time state
        			if((mode0 == mode_xhzl && in < 0) || mode0 == mode_hxzl)
        				gain = gainp;
        			else if((mode0 == mode_hzlx && in > 0) || mode0 == mode_hzxl)
        				gain = gainn;
        			Xdot = gain*in;
        		break;
        
        		case 1:
        			// compute the outputs of the block
        			if(X >=Lhi || X <= Llo)
        				Igain = 0;
        			else if (X > 0)
        				Igain = gainp;
        			else
        				Igain = gainn;
        			out = X;
        		break;
        
        		case 9:
        			// compute zero crossing surfaces and set modes
        			surf0 = X - Lhi;
        			surf1 = X;
        			surf2 = X - Llo;
        
        			if(get_phase_simulation() == 1)
        			{
        				if(surf0 >= 0)
        					mode0 = mode_xhzl;
        				else if(surf2 <= 0)
        					mode0 = mode_hzlx;
        				else if(surf1 > 0)
        					mode0 = mode_hxzl;
        				else
        					mode0 = mode_hzxl;
        			}
        		break;
        	}
        }

After that I have called the function `ilib_for_link` with following
arguments `ilib_for_link('lim_int','lim_int_comp.c',[],"c")`

The function returns following output:

ilib_for_link('lim_int','lim_int_comp.c',[],"c")
       Generate a loader file
       Generate a Makefile
       Running the Makefile
       Compilation of lim_int_comp.obj
       Building shared library (be patient)
     
    !------------- Compile file lim_int_comp.c --------------                               
!
    !                                                                                       
!
    !x86_64-w64-mingw32-gcc.exe -c -DWIN32 -D_MSC_VER -DSTRICT -DFORDLL
-I"C:/PROGRA~1/SCILAB!
    !     ~1.2/libs/MALLOC/includes"
-I"C:/PROGRA~1/SCILAB~1.2/modules/core/includes" -I"C:/P!
    !     ROGRA~1/SCILAB~1.2/modules/api_scilab/includes"
-I"C:/PROGRA~1/SCILAB~1.2/modules/c!
    !     all_scilab/includes"
-I"C:/PROGRA~1/SCILAB~1.2/modules/output_stream/includes" -I"C!
    !     :/PROGRA~1/SCILAB~1.2/modules/jvm/includes"
-I"C:/PROGRA~1/SCILAB~1.2/modules/local!
    !     ization/includes"
-I"C:/PROGRA~1/SCILAB~1.2/modules/dynamic_link/includes" -I"C:/PR!
    !     OGRA~1/SCILAB~1.2/modules/mexlib/includes"
-I"C:/PROGRA~1/SCILAB~1.2/modules/time/i!
    !     ncludes" -I"C:/PROGRA~1/SCILAB~1.2/modules/windows_tools/includes"
-I"C:/PROGRA~1/S!
    !     CILAB~1.2/libs/f2c" -I"C:/PROGRA~1/SCILAB~1.2/libs/hashtable"
-I"C:/PROGRA~1/SCILAB!
    !     ~1.2/libs/intl" -m64   lim_int_comp.c                                             
!
    !                                                                                       
!
    !lim_int_comp.c: In function 'lim_int':                                                 
!
    !                                                                                       
!
    !lim_int_comp.c:76:7: warning: implicit declaration of function
'get_phase_simulation' [-!
    !     Wimplicit-function-declaration]                                                   
!
    !                                                                                       
!
    !    if(get_phase_simulation() == 1)                                                    
!
    !                                                                                       
!
    !       ^~~~~~~~~~~~~~~~~~~~                                                            
!
    !                                                                                       
!
    !------------- Link files --------------                                                
!
    !                                                                                       
!
    !x86_64-w64-mingw32-gcc.exe --shared lim_int_comp.o 
-L"c:\cygwin64\x86_64-w64-mingw32\li!
    !     b"
-LC:\Users\Stepan\AppData\Roaming\Scilab\scilab-5.5.2\mingwlib_x64 -lstdc++
-lgf!
    !     ortran -lMALLOC -lblasplus -lf2c -llapack -lcore -lcore_f
-lintersci -loutput_strea!
    !     m -ldynamic_link -linteger -loptimization_f -ljvm
-lscilocalization -lintl -llinpac!
    !     k_f -lcall_scilab -ltime -lapi_scilab -lscilab_windows -lscicos
-lscicos_blocks -ls!
    !     cicos_blocks_f -lscicos_f -o liblim_int.dll 
-Wl,--out-implib=liblim_int.a -Wl,--ex!
    !     port-all-symbols -Wl,--enable-auto-import -Wl	                                    
!
    !                                                                                       
!
    !x86_64-w64-mingw32-gcc.exe: error: unrecognized command line option
'-Wl'; did you mean !
    !     '-W'?                                                                             
!
    !                                                                                       
!
    !Makelib:102: recipe for target 'liblim_int.dll' failed                                 
!
    !                                                                                       
!
    !make: *** [liblim_int.dll] Error 1                                                     
!
     !--error 10000 
    ilib_compile: Error while executing Makelib.
    at line      25 of function dlwCompile called by :  
    at line      51 of function ilib_compile called by :  
    at line      94 of function ilib_for_link called by :  
    ilib_for_link('lim_int','lim_int_comp.c',[],"c")

It seems to me that the problem is that prototype for get_phase_simulation
function is
missing. Has anybody already encountered this problem? Thanks for any
suggestions.



--
Sent from: http://mailinglists.scilab.org/Scilab-users-Mailing-Lists-Archives-f2602246.html



More information about the users mailing list