Script programmering

ALGEMENE INFORMATIE

Deze documentatie beschrijft hoe een aangepast object kan worden geprogrammeerd.

Vereisten

U heeft Loxone Config 2.1 of hoger nodig om PicoC-scripts in de configuratiesoftware te gebruiken. Raadpleeg onze recentste beta-releases voor het gebruik van de scripts.

ONDERLIGGEND

De programmeertaal PicoC (http://code.google.com/p/picoc/) wordt gebruikt. PicoC is een zeer kleine C-interpreter voor scripts. Dit werd oorspronkelijk geschreven voor het scripten van een UAV-boordvluchtsysteem en is ook zeer goed geschikt voor andere robotica-, ingebedde en niet-ingebedde toepassingen.

BELANGRIJK

  • Merk op dat niet kan worden voldaan aan de volledige C-specificatie!
  • De programmacode is geïnterpreteerd. Daarom dient u de code zo laag mogelijk te houden. Vermijd complexe programmastructuren.
  • Elk programma wordt uitgevoerd in een afzonderlijke taak, dus asynchroon ten opzichte van de PLC.
  • Uitvoer met printf wordt naar het logvenster van Loxone Config geschreven.
  • Merk ook op dat bij eigen programmering het systeem kan crashen. Programmeer uw instructies zorgvuldig. Voor een noodsituatie moet een SD-kaart worden gecreëerd, zodat het systeem opnieuw operationeel kan worden.
  • Als u het programma voor onbepaalde tijd wilt uitvoeren, dient u in de programmalussen impliciet een slaapfunctie toe te voegen, zodat het programma geen nodeloze CPU-tijd verbruikt.
  • Een integer heeft 32-bits, little endian.
  • 128 kB zijn beschikbaar voor heap en stack. Gebruik het geheugen zuinig; vergeet niet het geheugen vrij te maken.
  • Alle functies die een pointer retourneren, moeten opnieuw worden toegewezen aan het geheugen met free (), tenzij de pointer als een parameter werd doorgegeven.
  • De tijdwaarden worden aangegeven in seconden sinds de 1.1.2009 0 UTC-klok.
  • De tekenreeksen zijn gecodeerd in UTF-8.
  • Gebruik de mathematische functie spaarzaam – de processor in de Miniserver heeft geen rekenkundige hardware-eenheid.

De scripts werken enkel in LiveView.

PLC-OBJECTEN

Het programma-object heeft 16 ingangen en uitgangen. U kunt het object invoegen door dit te kiezen bij “Algemeen” in het tabblad “Mijn project”.

Het programma heeft ook een foutuitgang (TeQ) waar eventuele interpreter-foutmeldingen worden aangeboden. Op die manier kunnen syntaxisfouten worden gedetecteerd.

De programmacode kan worden bewerkt door dubbel te klikken op het programmaobject.

BESCHIKBARE FUNCTIES

In de volgende hoofdstukken worden alle beschikbare functies vermeld en worden alle Miniserver-specifieke functies beschreven. Voor alle standaard C-functies is er heel veel informatie te vinden in de overeenkomstige literatuur (bijv. www.cplusplus.com/reference/clibrary/).

FUNCTIES VAN C-BIBLIOTHEEK

char *getprogramname();
void printf(char *format, …);
char *sprintf(char *ptr, char *format, …);
void exit();
void *malloc(int size);
void *calloc(int num,int size);
void *realloc(void *ptr,int size);
void free(void *ptr);
int atoi(char *str);
float atof(char *str);
void strcpy(char *dst,char *src);
void strncpy(char *dst,char *src,int len);
int strcmp(char *str1,char *str2);
int strncmp(char *str1,char *str2,int len);
void strcat(char *dst,char *src);
char *strdup(char *str);
char* strstr(char *str,char *strfind);
int strfind(char *str,char *strfind,int pos);
int strlen(char *str);
void memset(void *ptr,int val,int len);
void memcpy(void *dst,void *src,int len);
int memcmp(void *ptr1,void *ptr2,int len);
void errorprintf(char *format,…);

MATHEMATISCHE FUNCTIES

float sin(float x);
Geeft de sinus van een hoek van x radialen.
float cos(float x);
Geeft de cosinus van een hoek van x radialen.
float tan(float x);
Geeft de tangens van een hoek van x radialen.
float asin(float x);
Geeft de belangrijkste waarde van de boogsinus van x, uitgedrukt in radialen. In driehoeksmeetkunde is de boogsinus de omgekeerde bewerking van sinus.
float acos(float x);
Geeft de belangrijkste waarde van de boogcosinus van x, uitgedrukt in radialen. In driehoeksmeetkunde is de boogcosinus de omgekeerde bewerking van cosinus.
float atan(float x);
Geeft de belangrijkste waarde van de boogtangens van x, uitgedrukt in radialen. In driehoeksmeetkunde is de boogtangens de omgekeerde bewerking van tangens.
float sinh(float x);
Geeft de hyperbole sinus van x.
float cosh(float x);
Geeft de hyperbole cosinus van x.
float tanh(float x);
Geeft de hyperbole tangens van x.
float exp(float x);
Geeft de basis-e exponentiële functie van x; dit is het getal e verhoogd tot de macht x.
float fabs(float x);
Geeft de absolute waarde van x
float log(float x);
Geeft het natuurlijk logaritme van x.
float log10(float x);
Geeft het gemeenschappelijke (basis-10) logaritme van x.
float pow(float base,float exponent);
Geeft het grondgetal tot de machtexponent.
float sqrt(float x);
Geeft de vierkantswortel van x.
float round(float x);
Geeft de afgeronde waarde van x.
float ceil(float x);
Geeft de kleinste integrale waarde die niet kleiner is dan x.
float floor(float x);
Geeft de grootste integrale waarde die niet groter is dan x.

GEAVANCEERDE FUNCTIES VAN C-BIBLIOTHEEK

int batoi(char *str);
float batof(char *str);
char* strstrskip(char *str,char *strfind);
char *index(char *,int);
int lineno();

PLC-FUNCTIES

Volgende functies zijn beschikbaar:

void setlogtext(char *str);
float getio(char *str);
int setio(char *str,float value);
int getinputevent();
float getinput(int input);
char *getinputtext(int input);
void setoutput(int output,float value);
void setoutputtext(int output,char *str);

BESTANDSFUNCTIES

FILE *fopen(char *filename,char *mode);
int fclose(FILE *f);
int fprintf(FILE *f,char *format, … );
int fputc(int character,FILE *f);
int fputs(char *str, FILE *f);
int fflush(FILE *f);
int fwrite (void *ptr,int size,int count,FILE *f);
int fgetc(FILE *f);
char *fgets(char *str,int num,FILE *f);
int fread(void *,int size,int count,FILE *f);
int fseek(FILE *f,long offset,int origin);
int remove(char *filename);
int rename(char *oldname,char *newname);
FILE* tmpfile();
char *tmpnam(char* str);

HTTP-FUNCTIES

char*httpget(char*address,char*page);

BUFFERFUNCTIES

int getshort(void * p,int bBigEndian);
unsigned int getushort(void * p,int bBigEndian);
int getint(void * p,int bBigEndian);
unsigned int getuint(void * p,int bBigEndian);
float getfloat(void * p,int bBigEndian);
float getdouble(void * p,int bBigEndian);

STREAM-FUNCTIES

STREAM *stream_create(char* filename,int read,int append);
void stream_printf(STREAM* stream,char *format, …);
int stream_write(STREAM* stream,void* ptr,int size);
void stream_flush(STREAM* stream);
int stream_read(STREAM* stream,void* ptr,int size,int timeout);
int stream_readline(STREAM* stream,void* ptr,int maxsize,int timeout);
void stream_close(STREAM* stream);

BESCHRIJVING VAN GEAVANCEERDE FUNCTIES VAN C-BIBLIOTHEEK

atoi

int batoi(char *str);

Werkt zoals de atoi standaard C-functie behalve dat blanco’s aan het
begin van parameter str toegestaan zijn.
Voorbeeld:

atoi(“ 21”); // return value = NULL
batoi(“ 21”); // return value = 21

batof

float batof(char *str);

Werkt zoals de atof standaard C-functie behalve dat blanco’s aan het begin van parameter str toegestaan zijn. Voorbeeld:

atof(“ 2.1”); // return value = NULL
batof(“ 2.1”); // return value = 2.1

strstrskip

char* strstrskip(char *str,char *strfind);

Werkt zoals de strstr standaard C-functie, behalve dat de lengte van parameter strfind wordt toegevoegd aan de resultaatpointer.
Voorbeeld:

strstr(“das ist ein test”,”ein ”); // return value = “ein test”
strstrskip(“das ist ein test”,”ein ”); // return value = “test”

index

char *index(char *str,int charfind);

Geeft een pointer naar de eerste voorval van het teken charfind in str, of een null-pointer als charfind geen deel uitmaakt van str.
Voorbeeld:

index(“0123456789”,0x32); // return value = “23456789”

lineno

int lineno();]

Geeft het huidige lijnnummer in het script.

getxmlvalue

char *getxmlvalue(char *str,int index,char* name);

Geeft de waarde van name in str, of een null-pointer als name geen deel uitmaakt van str.

Parameters:
str: Te parseren XML-tekenreeks
index: de index van het optreden van name (eerste element is 0)
name: XML-attribuut name dat moet worden opgehaald

Het geheugen waarnaar de geretourneerde pointer wijst, moet worden vrijgegeven met de functie free().
Voorbeeld:

getxmlvalue(“<XML name=\”test\”>”,0,”name”); // return value = “test”

getcpuinfo

int getcpuinfo();

Geeft de effectieve waarde van het CPU-gebruik in %.

getheapusage

int getheapusage();

Geeft de effectieve waarde van de systeem-heap in kB.

getmaxheap

int getmaxheap();

Geeft de maximumwaarde van de systeem-heap in kB.

getspsstatus

int getspsstatus();

Geeft het affectieve aantal cycli dat door de PLC is verwerkt.

localwebservice

char *localwebservice(char *str);

Voert de webservice uit en geeft een pointer naar de XML-antwoordtekenreeks.

Parameters:
str: webservice

Het geheugen waarnaar de geretourneerde pointer wijst, moet worden vrijgegeven met de functie free(). Voorbeeld:

char* p = localwebservice(“dev/sps/status”);
free(p);

BESCHRIJVING VAN PLC-FUNCTIES

setlogtext

void setlogtext(char *str);

Schrijft de tekenreeks die vervat is in parameter str naar het logvenster van Loxone Config.

getio

float getio(char *str);

Geeft de waarde van de gespecificeerde virtuele ingang of een virtuele uitgang.
Voorbeeld:

getio(“VI1”); // Geeft de waarde van de virtuele ingang VI1

setio

int setio(char *str,float value);

Stelt de waarde in van de gespecificeerde virtuele ingang of een virtuele uitgang.
Voorbeeld:

setio(“VI1”,6.33); // Stelt de waarde van de virtuele ingang VI1 in op 6.33

getinputevent

int getinputevent();

Geeft een bitmasker dat de wijzigingen van ingangen bevat (bit 0 = eerste ingang van object, begint met tekstingangen gevolgd door analoge ingangen).

Een geretourneerde waarde van 0x02 betekent bijvoorbeeld dat ingang 2 werd gewijzigd.
(zie voorbeeld 1).

getinput

float getinput(int input);

Geeft de waarde van de analoge ingang die gespecificeerd is in parameter input. (0 = eerste analoge ingang) (zie voorbeeld 1).

getinputtext

char *getinputtext(int input);

Geeft de tekenreeks van de tekstingang die gespecificeerd is in parameter input. (0 = eerste tekstingang).

setoutput

void setoutput(int output,float value);

Stelt de gespecificeerde analoge uitgang in op de gespecificeerd waarde. (0 = eerste analoge uitgang) (zie voorbeeld 1).

setoutputtext

void setoutputtext(int output,char *str);

Stelt de gespecificeerde tekstuitgang in op de tekenreeks die gespecificeerd is in parameter str. (0 = eerste tekstuitgang) (zie voorbeeld 1).

BESCHRIJVING VAN TIJDFUNCTIES

sleep

void sleep(int ms);

Slaaptijd in milliseconden.

sleeps

void sleeps(int s);

Slaaptijd in seconden.

getcurrenttime

unsigned int getcurrenttime();

unsigned int getcurrenttime();

getyear

int getyear(unsigned int time,int local);

Jaar van gespecificeerde tijd ophalen. U kunt de volgende parameters instellen:

time:
UTC-tijd in seconden sinds 2009

local:
Specificeert de tijdnotatie: lokale tijd indien 1, UTC indien 0

getmonth

int getmonth(unsigned int time,int local);

Maand van de gespecificeerde tijd ophalen. U kunt de volgende parameters instellen:

time: UTC-tijd in seconden sinds 2009
local: Specificeert de tijdnotatie: lokale tijd indien 1, UTC indien 0

getday

int getday(unsigned int time,int local);

Dag van de gespecificeerde tijd ophalen. U kunt de volgende parameters instellen:

time: UTC-tijd in seconden sinds 2009
local: Specificeert de tijdnotatie: lokale tijd indien 1, UTC indien 0

gethour

int gethour(unsigned int time,int local);

Uur van de gespecificeerde tijd ophalen. U kunt de volgende parameters instellen:

time: UTC-tijd in seconden sinds 2009
local: Specificeert de tijdnotatie: lokaal indien 1, UTC indien 0

getminute

int getminute(unsigned int time,int local);

Minuut van de gespecificeerde tijd ophalen. U kunt de volgende parameters instellen:

time: UTC-tijd in seconden sinds 2009
local: Specificeert de tijdnotatie: lokaal indien 1, UTC indien 0

getsecond

int getsecond(unsigned int time,int local)

Seconde van de gespecificeerde tijd ophalen. U kunt de volgende parameters instellen:

time: UTC-tijd in seconden sinds 2009
local: Specificeert de tijdnotatie: lokaal indien 1, UTC indien 0

gettimeval

unsigned int gettimeval(int year,int month,int day,int hour,int minutes,int seconds,int local);

UTC-tijd in seconden sinds 2009 ophalen. Als de parameters year, month, day, hour, minutes en seconds UTC-tijd zijn, moet de parameter local op 0 ingesteld zijn. Als de parameters year, month, day, hour, minutes en seconds lokale tijd zijn, moet de parameter local op 1 ingesteld zijn.

convertutc2local

unsigned int convertutc2local(unsigned int timeutc);

Converteert UTC-tijd naar lokale tijd.

convertlocal2utc

unsigned int convertlocal2utc(unsigned int timelocal);

Converteert lokale tijd naar UTC-tijd.

BESCHRIJVING VAN BESTANDSFUNCTIES

fseek

int fseek(FILE *f,long offset,int origin);

Er is een verschil met de standaard C-functie fseek: oorsprong moet 0, 1 of 2 zijn.
Als iemand de standaard C-syntaxis wil gebruiken, dient hij de volgende definities aan te brengen in het PicoC-script:

#define SEEK_CUR        0            // zoeken vanaf huidige positie
#define SEEK_SET        1            // zoeken vanaf begin van bestand
#define SEEK_END        2            // zoeken vanaf einde van bestand

Voor alle andere standaard C-bestandsfuncties is er heel veel informatie te vinden in de literatuur (bijv. www.cplusplus.com/reference/clibrary/).

BESCHRIJVING VAN HTTP FUNCTIES

httpget

char *httpget(char *address,char *page);

Download de opgegeven pagina van het opgegeven adres. U kunt de volgende parameters instellen:

address: Serveradres bijv. “de.wikipedia.org”
page: Pagina op de opgegeven server bijv. “/wiki/Intelligentes_Wohnen”

Het geheugen waarnaar de geretourneerde pointer wijst, moet worden vrijgegeven met de functie free().

BESCHRIJVING VAN BUFFERFUNCTIES

getshort

int getshort(void * p,int bBigEndian);

Leest binaire gegevens (2 bytes ondertekend kort) uit de buffer met pointer p.

Als bBigEndian niet gelijk is aan 0, worden gegevens geïnterpreteerd als “big endian”.

getushort

unsigned int getushort(void * p,int bBigEndian);

Leest binaire gegevens (2 bytes niet-ondertekend kort) uit de buffer met pointer p.

Als bBigEndian niet gelijk is aan 0, worden gegevens geïnterpreteerd als “big endian”.

getint

int getint(void * p,int bBigEndian);

Leest binaire gegevens (4 bytes ondertekend int) uit de buffer met pointer p.

Als bBigEndian niet gelijk is aan 0, worden gegevens geïnterpreteerd als “big endian”.

getuint

unsigned int getuint(void * p,int bBigEndian);

Leest binaire gegevens (4 bytes niet-ondertekend int) uit de buffer met pointer p.

Als bBigEndian niet gelijk is aan 0, worden gegevens geïnterpreteerd als “big endian”.

getfloat

float getfloat(void * p,int bBigEndian);

Leest binaire gegevens (4 bytes IEEE float) uit de buffer met pointer p.

Als bBigEndian niet gelijk is aan 0, worden gegevens geïnterpreteerd als “big endian”.

getdouble

float getdouble(void * p,int bBigEndian);

Leest binaire gegevens (8 bytes IEEE float) uit de buffer met pointer p.

Als bBigEndian niet gelijk is aan 0, worden gegevens geïnterpreteerd als “big endian”.

BESCHRIJVING STREAM-FUNCTIES

stream_create

STREAM *stream_create(char* filename,int read,int append);

Creëert een file-stream, een tcp-stream, een udp-stream, een syslog-stream of een RS232/RS485-stream (zie voorbeeld 2 en voorbeeld 3).

bestandsnaam:

WaardeBeschrijving
/path/filenameFile-stream
/dev/tcp/server-address/portTCP-stream
/dev/udp/server-address/portUDP-stream
/dev/syslogSyslog-stream
/dev/tty/naam van RS232 of RS485RS232/RS485-stream (alleen)
Extensionstream_read is mogelijk, niet stream_write

read: Als stream een file-stream is: 1 = file lezen; 0 = file schrijven
append: 1 = tekst toevoegen aan file; 0 = tekst in file overschrijven

streamprintf

void stream_printf(STREAM* stream,char *format, …);

Schrijft een sequentie van gegevens geformatteerd zoals bepaald door het formaatargument, naar de uitgangsbuffer van de gespecificeerde stroom. Na de formatteringsparameter verwacht de functie minstens evenveel bijkomende argumenten als vermeld in het formaat.

stream_write

int stream_write(STREAM* stream,void* ptr,int size);

Schrijft een aantal grootte-elementen van het geheugenblok waarnaar door ptr wordt gewezen, naar de uitgangsbuffer van de gespecificeerde stream (zie voorbeeld 2).

De positie-indicator van de stream wordt verhoogd met het totale aantal geschreven bytes.
Het totale aantal met succes geschreven elementen wordt geretourneerd. Als dit aantal verschillend is van de grootte-parameter, wijst dit op een fout.

stream_flush

void stream_flush(STREAM* stream);

Als de gegeven stream een file-stream is en het bestand werd geopend voor schrijven, worden alle niet-geschreven gegevens in de uitgangsbuffer naar het bestand geschreven (zie voorbeeld 2).

Als de gegeven stream een tcp-stream, een udp-stream of een syslog-stream is, worden alle gegevens in de uitgangsbuffer naar de server verzonden.

stream_read

int stream_read(STREAM* stream,void* ptr,int size,int timeout);

Leest een aantal grootte-elementen uit de ingangsbuffer van de opgegeven stream en slaat ze op in het geheugenblok dat gespecificeerd is door ptr (zie voorbeeld 2).

De time-out wordt uitgedrukt in milliseconden. De positie-indicator van de stream wordt verhoogd met het totale aantal gelezen bytes. Het totale aantal met succes gelezen elementen wordt geretourneerd.

stream_readline

int stream_readline(STREAM* stream,void* ptr,int maxsize,int timeout);

Als de gegeven stream een file-stream is, wordt de volgende regel van het bestand gelezen.

Het maximale aantal te lezen elementen is gespecificeerd met parameter maxsize. De time-out wordt uitgedrukt in milliseconden.

stream_close

void stream_close(STREAM* stream)

Sluit de opgegeven stream en ontkoppelt al het geheugen dat door de stream werd gebruikt.

VOORBEELDEN

De volgende voorbeelden tonen hoe script-programma’s kunnen worden gecreëerd.

VOORBEELD 1: BEREKENING

Dit programma toont hoe een eigen berekening wordt uitgevoerd:
Als er zich een wijziging op een ingang voordoet, wordt de waarde van ingang 1 vermenigvuldigd met de waarde op ingang 2 plus de waarde op ingang 3 aan uitgang 1 gegeven.
De formule wordt uitgevoerd als tekst op tekstuitgang 1.

Deze code-snippet is waarschijnlijk voor het programmablok met 4 ingangen. U kunt het bitmasker in regel 8 wijzigen om de code geschikt te maken voor andere programmablokken:

Program 8:   if(nEvents & 0x1c)

Program 16:   if(nEvents & 0x38)

// write program here in PicoC
char szBuffer[128];
float f1,f2,f3,f4;
int nEvents;
while(TRUE)
{
nEvents = getinputevent();
if (nEvents & 0xe)
{
f1 = getinput(0);
f2 = getinput(1);
f3 = getinput(2);
f4 = f1 * f2 + f3;
setoutput(0,f4);
sprintf(szBuffer,“/ * %f + %f = %f“,f1,f2,f3,f4);
setoutputtext(0,szBuffer);
printf(szBuffer);
}
sleep(100);
}

VOORBEELD 2: WEBSITE DOWNLOADEN VIA TCP-STREAM

Dit voorbeeld toont hoe een website met een tcp-stream wordt gedownload en hoe de website wordt opgeslagen in een bestand.

#define BUFF_SIZE 40000
#define RD_BLOCK_SIZE 128
STREAM* pTcpStream = stream_create(„/dev/tcp/www.w3.org/80“,0,0); // create tcp stream
char* pTcpCmd = „GET / HTTP/1.0\r\nHost: www.w3.org\r\nUser-Agent: LoxLIVE [en]\r\nContent-Type: text/html; charset=utf-8\r\n\r\n“;
stream_write(pTcpStream,pTcpCmd,strlen(pTcpCmd)); // write to output buffer
stream_flush(pTcpStream); // flush output buffer
char szBuffer[BUFF_SIZE];
char szTmpBuffer[RD_BLOCK_SIZE];
int nCnt;
int nBytesReceived = 0;
// read stream
do
{
nCnt = stream_read(pTcpStream,szTmpBuffer,RD_BLOCK_SIZE,4000);
if (nCnt + nBytesReceived > BUFF_SIZE)
{
nBytesReceived = -1;
break; //File is too large
}
else if(nCnt > 0)
{
strncpy((char*)szBuffer + nBytesReceived, szTmpBuffer, nCnt);
nBytesReceived += nCnt;
}
}
while (nCnt > 0);
if (nBytesReceived > 0)
{
FILE* pw = fopen(„/w3.html“,“w“); // open file
fprintf(pw,“%s“,szBuffer); // write file
printf(„Bytes received: %d“,nBytesReceived);
fclose(pw);
}
stream_close(pTcpStream);

VOORBEELD 3: VERBINDING MAKEN MET APC USV ALS APCUPSD WORDT GEBRUIKT OP DE PC

Dit voorbeeld toont de effectieve belasting (AQ1), de batterijcapaciteit (AQ2) en stroomstoringen (AQ3).

char* p,*pS;
char szBuffer[1500];
int nLen;
int bOnline = 0;
double dCharge,dLoad;
printf(„Start APC watch“);
while(TRUE)
{
STREAM* stream = stream_create(„/dev/tcp/192.168.1.9/3551″,0,0);
if (stream != NULL)
{
szBuffer[0] = 0;
szBuffer[1] = 6;
stream_write(stream,szBuffer,2);
stream_flush(stream);
stream_write(stream,“status“,6);
stream_flush(stream);
nLen = stream_read(stream,szBuffer,2,1000);
nLen = stream_read(stream,szBuffer,sizeof(szBuffer) – 1,1000);
stream_close(stream);
szBuffer[nLen] = 0;
szBuffer[nLen + 1] = 0;
//printf(„APC Len=%d“,nLen);
pS = szBuffer;
while(*pS)
{
p = strstr(pS,“STATUS :“);
if (p != NULL)
{
p = strstr(pS,“STATUS : ONLINE“);
if (p != NULL)
bOnline = 1;
else
bOnline = 0;
}
else
{
p = strstr(pS,“LOADPCT :“);
if (p != NULL)
{
dLoad = batof(p + 11);
setoutput(0,dLoad);
}
else
{
p = strstr(pS,“BCHARGE :“);
if (p != NULL)
{
dCharge = batof(p + 11);
setoutput(1,dCharge);
break;
}
}
}
pS += (strlen(pS) + 1);
}
if (bOnline)
{
setoutput(2,1);
//printf(„Power OK Charge: %f%% Load: %f%%“,dCharge,dLoad);
}
else
{
setoutput(2,0);
//printf(„Power lost Charge: %f%% Load: %f%%“,dCharge,dLoad);
}
}
else
printf(„APC no connection“);
sleeps(10); // wait 10 seconds
}

VOORBEELD 4: LEZEN VAN RS232 EXTENSION VIA RS232 STREAM

Dit voorbeeld leest de bytes die van de RS232-extension werden ontvangen en plaatst ze op tekstuitgang 1. Het totale aantal ontvangen bytes wordt op de eerste analoge uitgang geplaatst.

#define BUFF_SIZE 256
STREAM* pRs232Stream = stream_create(„/dev/tty/my_rs232_extension“,0,0);// create rs232 stream
char szBuffer[BUFF_SIZE];
int nCnt;
int nBytesReceived = 0;
while(1)
{
nCnt = stream_read(pRs232Stream,szBuffer,BUFF_SIZE,100); // read stream
nBytesReceived += nCnt;
setoutput(0,(float)nBytesReceived);
setoutputtext(0,szBuffer);
sleep(100);
}

PICO-C COPYRIGHT

picoc wordt gepubliceerd onder de “New BSD License”.
http://www.opensource.org/licenses/bsd-license.php

Copyright (c) 2009, Zik Saleeba
Alle rechten voorbehouden.

Herdistributie en gebruik in bron- en binaire vorm, met of zonder wijziging, zijn toegestaan mits aan de volgende voorwaarden wordt voldaan:

  • Herdistributies van de broncode moeten de bovenstaande auteursrechtelijke kennisgeving, deze lijst met bepalingen en de volgende disclaimer bevatten.
  • Herdistributies in binaire vorm moeten de bovenstaande auteursrechtelijke kennisgeving, deze lijst met bepalingen en de volgende disclaimer reproduceren in de documentatie en / of andere materialen die bij de distributie worden geleverd.
  • De naam van de Zik Saleeba noch de namen van de bijdragers mogen zonder specifieke voorafgaande schriftelijke toestemming worden gebruikt om producten te onderschrijven of te promoten die zijn afgeleid van deze software.

 

DEZE SOFTWARE WORDT DOOR DE AUTEURSRECHTHOUDERS EN BIJDRAGERS
“AS IS” GELEVERD EN ELKE UITDRUKKELIJKE OF IMPLICIETE GARANTIE, MET INBEGRIP VAN MAAR NIET
BEPERKT TOT, IMPLICIETE GARANTIES VAN VERKOOPBAARHEID EN GESCHIKTHEID VOOR
EEN BEPAALD DOEL, WORDT UITGESLOTEN. IN GEEN GEVAL KUNNEN DE EIGENAAR VAN HET AUTEURSRECHT
OF BIJDRAGERS AANSPRAKELIJK WORDEN GESTELD VOOR ENIGERLEI DIRECTE, INDIRECTE, INCIDENTELE,
SPECIALE, KARAKTERISTIEKE OF GEVOLGSCHADE (MET INBEGRIP VAN MAAR NIET
BEPERKT TOT AANSCHAF VAN VERVANGENDE GOEDEREN OF DIENSTEN; VERLIES VAN GEBRUIK,
GEGEVENS OF WINSTEN; OF ONDERBREKING VAN BEDRIJFSACTIVITEITEN) OP WELKE MANIER OOK VEROORZAAKT EN VOLGENS ELKE
THEORIE VAN AANSPRAKELIJKHEID, HETZIJ IN CONTRACT, STRIKTE AANSPRAKELIJKHEID OF ONRECHTMATIGE DAAD
(MET INBEGRIP VAN NALATIGHEID OF ANDERSZINS) VOORTVLOEIEND UIT ENIGERLEI GEBRUIK
VAN DEZE SOFTWARE, ZELFS ALS GEWEZEN IS OP DE MOGELIJKHEID VAN DERGELIJKE SCHADE.