For subroutines, you can either use Sub or Function. Function can return a value, but Sub can't.
Sub SubName (Param1 As DataType [,ParamX As DataType][,…]) Statements [Exit sub] ' Exit during sub-routine End Sub Function FunctionName (Param1 As DataType [,…])[As ReturnDataType] Statements [Exit Function] ' Exit during sub-routine End Function
To return values using Function, simply store the final value as the name of the function as shown below:
Function ADD_VALUE(B As Byte) As Byte ADD_VALUE = B + 1 ' Return B+1. End Function
When you declare variables inside a subroutine or a function, it is considered a “Local” variable. Local variables are created when the subroutine or function is called, and removed when the subroutine or function exits. This means that local variables will temporarily allocate data memory for the duration of the call. Local variables may only be referred to or used inside the subroutine or function in which they were declared.
On the other hand, global variables may be used anywhere in your program.
Dim A As Integer ' Declare A as Global Variable LOOP1: A = A + 1 Debug Dp(A),CR ' Display A on Debug screen DELAYTIME ' Call Sub DELAYTIME GoTo LOOP1 End ' End of Main Program Sub DELAYTIME() Dim K As Integer ' Declare K as Local Variable For K=0 To 10 Next End Sub
In the program above, A is declared as a global variable and K is declared as a local variable. A can be used anywhere in the program but K can only be used inside the subroutine DELAYTIME.
Arrays cannot be declared as local variables. Arrays must be declared as global variables.
Once the subroutine is created, they can be used like any other statement. For a subroutine, you do not need parenthesis around the parameters. Use commas to separate multiple parameters.
The example below shows how this is done:
DELAYTIME 100 ' Call subroutine End Sub DELAYTIME(DL As Integer) Dim K As Integer ' Declare K as Local Variable For K=0 To DL Next End Sub
For a function, you need parenthesis around the parameters. Parenthesis are required even when there are no parameters.
Dim K As Integer K = SUMAB(100,200) ' Call subroutine and store return value in K Debug Dec K,cr End Function SUMAB(A AS INTEGER, B AS INTEGER) As Integer SUMAB = A + B End Function
Subroutines must be created after the main program. To do this, simply put End at the end of your main program as shown below. End is only required if you have subroutines
Dim A As Integer LOOP1: A = A + 1 Debug DP(A),CR DELAYTIME Goto Loop1 End ' End of main program Sub DELAYTIME() Dim K As Integer For K=0 To 10 Next End Sub
Subroutines and functions are created after the End statement. Gosub subroutines must be within the main program like shown below:
The End statement is used to differentiate between the BASIC main program and the program's subroutines. The END statement in Ladder Logic is used to indicate the final Ladder Logic rung.
Functions may use any data type, except arrays, as parameters and return values:
Dim A(10) As Integer Function ABC(A AS Single) as Single ' Return Single value End Function Function ABC(A AS long) ' Long value as a parameter End Function ' When return value is not declared,Long ' will be used as return value.
Please avoid returning a
String data type from a
Function, as it can result in undefined behavior. Instead, simply define the return value as a global variable and assign it in a subroutine.
Dim ReturnValue As String * 100 Sub Example(var as Integer) If var == 0 Then ReturnValue = "Zero" Else ReturnValue = "Non-Zero" EndIf End Sub
Arrays cannot be used as parameters. The following is not allowed.
Function ARRAYUSING(A(10) AS Integer) ' Arrays may not be used as parameters. : End Function
But you may use one element of an array as a parameter:
Dim b(10) as Integer K = ARRAYUSING(b(10)) ' Use 10th element of array b as a parameter. Function ARRAYUSING(A AS Integer) as Integer : End Function
All subroutine parameters are passed by value, not by reference. If the parameter value is changed within a subroutine, it will not affect the variable passed to the subroutine.
Dim A As Integer Dim K As Integer A = 100 K = ADDATEN(A) Debug Dec? A, Dec? K,CR ' A is 100 and K is 110 End Sub ADDATEN(V As Integer) V = V + 10 ' A does not change when V is changed. ADDATEN = V End Sub
In contrast, some languages allow values to be passed by reference in which the actual memory address is passed to the subroutine. Cubloc BASIC only supports passing by value.
If you run out of room, you can use an underscore character (_) to go to the next line as shown here:
ST = "COMFILE TECHNOLOGY" ST = "COMFILE _ TECHNOLOGY"
Use an apostrophe/single-quote (') to add comments. Comments are discarded during at compile time, and will not consume any program memory.
ADD_VALUE = B + 1 ' Add 1 to B.(Comment)
Nested subroutines are supported in Cubloc.
A=Floor(SQR(F)) ' Do Floor() on Sqr(F).
Colons cannot be used to append commands in Cubloc BASIC, as is possible in some other languages.
A=1: B=1 : C=1 ' Incorrect. A=1 ' Correct. B=1 C=1