LAB PLC
Lab PLC is written by Mirko Bjelica.
He wrote it for his exam and after reading this project you will admit that
he deserves the 10 he got for his work!
This project is well suited for educational purposes. Mirko supplied all the
source and is willing to help if you have a question. Of course he also likes to
know if his design is useful for you.
Now what is this LAB PLC you might wonder?
LAB PLC is a PLC Compiler written in VB DOS.
The PLC software is written in BASCOM-8051 and runs in a small 20 pins 8051
chip.
LAB PLC documentation LAB PLC schematic .ZIP with source code
And here is the At89C2051 BASCOM-8051 source.
'-----------------------------------------------------------------
' 1999 Mirko Bjelica, Yugoslavia
'
' Contact: mikanb@EUnet.yu
'
' Lab-PLC
' -------
' This program is a
part of whole laboratory PLC project which
'I realized as my final exam on Polytechnical Engineering
College.
'Lab-PLC has 4 inputs, 4 outputs and one timer and it is
created
'for educational purposes. There is also 10 memory markers
used
'as temporary bits between gates. At this moment Lab-PLC
is installed
'at the college laboratory to control one 3 phase
electromotor. I used
'ATMEL's microcontroller AT89C2051 because of its simplicity
and because it
'had enough I/O pins for this project. Project also
includes software
'written in Visual Basic for DOS, which is used to load
RAM memory of
'AT89C2051, PCB, Schematic and a user's manual.
'NOTE:
' Timer - Timer in PLC Device
'uTimer - Timer in AT89C2051 micro controller
'Input_1, Input_2 - Two inputs of single logic gate or
Timer (Input_1)
'Output_ - Output of logic gate or Timer
'-----------------------------------------------------------------
'Variable dimensioning
Dim Output_ As Bit , Input_1 As Bit , Input_2 As Bit , Temporary As Bit , Jump As Bit
Dim Working As Bit , Ctrlbit As Bit , Edge As Bit , Tmpmem As Byte , Interval As Byte
Dim K As Byte , Pc_input As Byte , Countr As Integer , Ir As Bit
Dim M0 As Bit : Dim M1 As Bit : Dim M2 As Bit : Dim M3 As Bit : Dim M4 As Bit
Dim M5 As Bit : Dim M6 As Bit : Dim M7 As Bit : Dim M8 As Bit : Dim M9 As Bit
O1 Alias P1.0 : O2 Alias P1.1 : O3 Alias P1.2 : O4 Alias P1.3
I1 Alias P1.4 : I2 Alias P1.5 : I3 Alias P1.6 : I4 Alias P1.7
'Initialization of uTimer
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Timer0_interapt
Load Timer0 , 250
Enable Interrupts
Enable Timer0
Priority Set Timer0
'Definition of Baud Rate for RS232 communication between
PC and PLC
$baud = 4800
$crystal = 12000000
Set P3.7 'Turn led "RECEIVED DATA" OFF
Reset P3.3 'Led "READY FOR RECEIVING" starts to blink
P1 = &B11111111 'Clear all inputs and outputs
K = 67 'RAM Memory address from where starts writing PLC program
Do 'Routine for loading RAM memory
Pc_input = Waitkey 'Wait for data
mov R0,{k} 'generating indirect address
Acc = Pc_input 'proceed data to
accumulator
mov @R0,A 'Write received data to indirectly addressed memory
location
inc k
Loop Until Pc_input = 99 'Code for "End Of Transfer"
Reset P3.7 'Turn led "RECEIVED DATA" ON
Set P3.3 'Led "READY FOR RECEIVING" stops to blink
Tmpmem = 0 '{
Countr = 0 '{
Jump = 0 '{Initialization of used variables
Edge = 0 '{
Ctrlbit = 0 '{
Prgstart: 'Inception
K = 66 'address-1 because of increment in next subroutine
Gosub Readram 'Go and read RAM memory
'Program
Nastavi:
'Detection of logic function and timer
Select Case Tmpmem
Case 10 : Gosub Inputs 'Take logic conditions of input1 and input2
Output_ = Input_1 And Input_2 'AND
Gosub Outp 'Set output of current logic gate
Goto Checkend
Case 11 : Gosub Inputs 'Take logic
conditions of input1 and input2
Output_ = Input_1 Or Input_2 'OR
Gosub Outp 'Set output of current logic gate
Goto Checkend
Case 12 : Gosub Inputs 'Take logic conditions of input1 and input2
Output_ = Input_1
Output_ = Not
Output_ 'NOT
Gosub Outp 'Set output of current logic gate
Goto Checkend
Case 13 : Gosub Inputs 'Take logic conditions of input1 and input2
Output_ = Input_1 And Input_2
Output_ = Not
Output_ 'NAND
Gosub Outp 'Set output of current logic gate
Goto Checkend
Case 14 : Gosub Inputs 'Take logic
conditions of input1 and input2
Output_ = Input_1 Or Input_2
Output_ = Not
Output_ 'NOR
Gosub Outp 'Set output of current logic gate
Goto Checkend
Case 15 : Gosub Inputs 'Take logic conditions of input1 and input2
Output_ = Input_1 Xor Input_2 'XOR
Gosub Outp 'Set output of current logic gate
Goto Checkend
Case 24 : Gosub Tajmer 'TIMER
Gosub Outp 'Set output of Timer
Goto Checkend
End Select
'Input detection
Inputs:
Gosub Readram ' /
Gosub Inpt '| Find first input of current log.gate
Input_1 = Temporary '
Gosub Readram ' /
Gosub Inpt '| Find second input of current log.gate
Input_2 = Temporary '
Return 'Return from subroutine Inputs
'Finding if input in current log.gate is phisical
input,phisical output or memory marker
Inpt:
Select Case Tmpmem
Case 16 : Temporary = I1
Case 17 : Temporary = I2
Case 18 : Temporary = I3
Case 19 : Temporary = I4
Case 20 : Temporary = O1
Temporary = Not Temporary
Case 21 : Temporary = O2
Temporary = Not Temporary
Case 22 : Temporary = O3
Temporary = Not Temporary
Case 23 : Temporary = O4
Temporary = Not Temporary
Case 30 : Temporary = M0
Case 31 : Temporary = M1
Case 32 : Temporary = M2
Case 33 : Temporary = M3
Case 34 : Temporary = M4
Case 35 : Temporary = M5
Case 36 : Temporary = M6
Case 37 : Temporary = M7
Case 38 : Temporary = M8
Case 39 : Temporary = M9
End Select
Return
'Finding if output from current log.gate is phisical
output or memory marker
Outp:
Gosub Readram
Select Case Tmpmem
Case 20 : Output_ = Not Output_
O1 = Output_
Case 21 : Output_ = Not Output_
O2 = Output_
Case 22 : Output_ = Not Output_
O3 = Output_
Case 23 : Output_ = Not Output_
O4 = Output_
Case 30 : M0 = Output_
Case 31 : M1 = Output_
Case 32 : M2 = Output_
Case 33 : M3 = Output_
Case 34 : M4 = Output_
Case 35 : M5 = Output_
Case 36 : M6 = Output_
Case 37 : M7 = Output_
Case 38 : M8 = Output_
Case 39 : M9 = Output_
End Select
Return
'Timer routine
Tajmer:
Gosub Readram ' /
Gosub Inpt '| Find input of Timer
Input_1 = Temporary '
If Jump = 1 Then 'Control bit for bypassing Timer input scan when Timer Workings
Goto L1
End If
Edge = Input_1
If Edge = 0 Then 'If input Timer input is low SET control bit
Set Jump
End If
L1:
If Input_1 = 1 Then 'These are 3 conditions which have to be accomplished to start
uTimer
If Edge = 0 Then
If Working = 0 Then
Start Timer0
Set Working
End If
Goto L2
End If
End If
Stop Timer0
Countr = 0 'Reset elapsed time counter
Working = 0 'Reset Timer condition bit
Output_ = 0 'Reset output of Timer
Ctrlbit = 0
L2:
If Ctrlbit = 1 Then
K = K + 1
Else
Gosub Readram
Interval = Tmpmem
Ctrlbit = 1
End If
If Interval = 0 Then
Stop Timer0
Countr = 0
Reset Output_
Jump = 0
Reset Working
Ctrlbit = 0
Else
If Working = 1 Then
Set Output_
Else
Reset Output_
End If
End If
Return
'Checking if it is end of PLC program and if it is, go
again from start
Checkend:
Gosub Readram
If Tmpmem = 99 Then
Goto Prgstart
Else
Goto Nastavi
End If
'Interrupt routine for Timer interval
Timer0_interapt:
Countr = Countr + 1 'Elapsed time counter
If Countr = 4000 Then '4000x250=1s
Interval = Interval - 1 'Previously set interval by user
Countr = 0 'Reset elapsed time counter
End If
Return
'Routine for reading RAM memory in Execution mode
Readram:
inc k 'Increment address value
mov R0,{k} 'Move value to indirect address register
mov A,@R0 'Move value from addressed location to accumulator
Tmpmem = Acc 'Store this value in temporary register because-
'leaving data in accumulator can cause loss-
'of that data while accumulator is used for other purposes
Return
End
|