code:
// fbd0.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
static float value[100];
static long time[100];
static int v_count=0;
static int c_step=-1;
static int c_call=0;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
FILE *fl;
char Buf[50];
memset(Buf,'\0',50);
if ((fl=fopen("table.cfg","r"))==0){
return 0;
}
while(feof(fl)==0){
if(fgets(Buf,50,fl)){
value[v_count]=(float)atof(Buf);
fgets(Buf,50,fl);
time[v_count]=atol(Buf);
v_count++;
}
}
fclose(fl);
return TRUE;
}
__declspec(dllexport) int FBD_DLL( float*, float*, int*, int* );
__declspec(dllexport) void zFBD_DLL_info( void* );
__declspec(dllexport) void zFBD_DLL_varname( char* );
// Структура описывающая FBD-модуль
typedef struct
{
int q_in; // Количество входов
int q_out; // Количество выходов
int q_int; // Зарезервировано
int type; // Номер в списке функциональных разделов.
// Должно быть равно 17
char name[8]; // Короткое имя для вывода на экран
char fname[8]; // Полное имя
} DO_DEFAULT;
// Тело FBD-модуля
int FBD_DLL( float *in, // Указатель на массив входов
float *out, // Указатель на массив выходов
int *l, int *rl ) // Зарезервировано
{
if(c_step==-1){
out[0]=in[0];
c_step=0;
c_call=0;
}
if ((in[1]==1)&&(in[2]!=1)){
if (c_step==0){
out[0]=in[0]+c_call*(value[c_step]-in[0])/time[c_step];
out[1]=time[c_step]-c_call;
if(c_call==time[c_step]){
c_step++;
c_call=0;
}
c_call++;
}
else{
out[0]=value[c_step-1]+c_call*(value[c_step]-value[c_step-1])/time[c_step];
out[1]=time[c_step]-c_call;
if(c_call==time[c_step]){
if(c_step==v_count){
c_step=-1;
c_call=0;
}
else{
c_step++;
c_call=0;
}
}
c_call++;
}
out[2]=c_step;
}
else{
if (c_step==0){
out[0]=in[0]+c_call*(value[c_step]-in[0])/time[c_step];
out[1]=time[c_step]-c_call;
}
else{
out[0]=value[c_step-1]+c_call*(value[c_step]-value[c_step-1])/time[c_step];
out[1]=time[c_step]-c_call;
}
out[2]=c_step;
}
if(in[3]==1){
c_call=0;
c_step=-1;
out[0]=in[0];
}
return 0;
}
// Формирует указатель на описание FBD-модуля
void zFBD_DLL_info( void *buf )
{
DO_DEFAULT *dd;
dd=(DO_DEFAULT *)buf;
strcpy( dd->name, "fbd0" );
strcpy( dd->fname, "fbd0" );
dd->q_in = 5;
dd->q_out = 3;
dd->type = 17;
dd->q_int = 0;
}
// Формирует указатель на имена входов и выходов.
// На каждое имя отводится 8 байт
void zFBD_DLL_varname( char *varname )
{
strcpy( varname+0, "RUN" );
strcpy( varname+8, "X0" );
strcpy( varname+16, "Go" );
strcpy( varname+24, "Stp" );
strcpy( varname+32, "Rst" );
strcpy( varname+40, "Q" );
strcpy( varname+48, "T" );
strcpy( varname+56, "Cv" );
}