PLC de Diseño Libre y Modular

Hola comunidad, de hace un tiempo comencé un proyecto que ha avanzado un poco, el mismo describe un PLC sencillo con el que se puedan interconectar diferentes tarjetas, en principio este consta de 3 pasos fundamentales
1- La CPU se emulará en otro dispositivo, ya se un PIC, o u otro de mayor potencia, pero es una decisión a tomar pues la programación será estándar para todos.
Aquí le describo como será:
Existirá un conjunto de instrucciones al igual que un microprocesador, se generará un código de máquina para cada instrucción y la sintaxis será la que se elija. Le pongo un breve ejemplo

Instruccion mov
destino origen ptr instruccion hexadecimal
00 00 11 00 mov fac,#valor 0ch
00 01 00 00 mov fac,fba 10h
00 10 00 00 mov fac,dptr memoria 20h
00 10 01 00 mov fac,wptr memoria 24h
00 10 10 00 mov fac,bptr memoria 28h
00 11 00 00 mov fac,fbp 30h

Luego la CPU se emula con un programa en C++, C o otro lenguaje se encargará de traducir estas instrucciones para ejecutarlas en la propia CPU física

#include "includes\memoria.c"

unsigned int fip=0,fac=0,fba=0,fbp=0,fps=0;
char byte[4]; //maximo tamaño
unsigned int i,byteprog,ptrmemoria,ptrdireccion;

void main() ;

void incio() org 0x00{
main();
}

void main(){
......
while (1){
instruccion = leer_memoria(fip);fip++;
ptrdireccion = leer_memoria(fip);fip++;
ptrdireccion += leer_memoria(fip)*0x100;fip++;
ptrdireccion += leer_memoria(fip)*0x10000;fip++;

if (instruccion == 0x10){ fac = fba; //mov fac,fba
}else if (instruccion == 0x30) { fac = fbp;//mov fac,fps
}else if (instruccion == 0x20) { ptrmemoria = ptrdirmemoria(ptrdireccion,3);fac = ptrmemoria; //mov fac,dptr memoria
}else if (instruccion == 0x24) { ptrmemoria = ptrdirmemoria(ptrdireccion,1);fac = ptrmemoria; //mov fac,wptr memoria
}else if (instruccion == 0x28) { ptrmemoria = ptrdirmemoria(ptrdireccion,0);fac = ptrmemoria; //mov fac,bptr memoria
}else if (instruccion == 0x0c) { fac = ptrdireccion; //mov fac,#valor
......
}

Aquí las instrucción leer memoria son definidas de acuerdo al tipo de hardware a implementar y esta contenida en :
#include "includes\memoria.c"
No escribo el código aquí para no saturar el tema pero le dejo la idea: En realidad lo que hace es leer de una memoria RAM externa el código que se quiere ejecutar en la CPU. Por eso cada vez que el apuntador de instrucciones solicite una instrucción mediante instruccion = leer_memoria(fip); lo que hace es obtener el código de la memoria RAM manipulando el hardware , fip++; incrementa el contador de instrucción ara leer la nueva instrucción.

Esto permitirá portar el firmware que contendrá la emulación de la CPU que queramos implementar en el prototipo de hardware para la CPU del PLC.

2- Una parte importante es que realicé un programa en C++ que compila las instrucciones en ensamblador a código hexadecimal que leerá la CPU, además de un programa que permite emular la CPU pudiendo comprobar el comportamiento de los programas.

Esto es realmente un 1% del proyecto pues falta mucho por realizar:
3- Incluyendo un programa que cree tanto LD, CFC a código ensamblador para luego compilar al nivel más bajo. Es decir un paquete de herramientas para facilitar el manejo de la configuración de hardware, dígase tarjetas de entrada salida, etc.
 
Arriba