Advertisement  

Thursday, 28 March 2024
     
 
Main Menu
Home Home
Shop Shop
News News
BASCOM-AVR BASCOM-AVR
BASCOM-8051 BASCOM-8051
Products Products
Application Notes Application Notes
Publications Publications
Links Links
Support Center Support Center
Downloads Downloads
Forum Forum
Resellers Resellers
Contact Us Contact Us
Updates Updates
MCS Wiki MCS Wiki
Online Help
BASCOM-AVR Help BASCOM-AVR Help
BASCOM-8051 Help BASCOM-8051 Help
Contents in Cart
Show Cart
Your Cart is currently empty.
Search the Shop

Products Search

User Login
Username

Password

If you have problem after log in with disappeared login data, please press F5 in your browser

RSS News
 
     
 

 
   
     
 
AN #26 - LAB PLC Print
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