Code to get information about and write data to an SDCard in a Schneider M251 PLC.

Variables:

PROGRAM SR_Main
VAR
	sBla: STRING(11);
	bla: PLC_R_SDCARD_STATUS;
	dResult: DINT;
	dTotalSpaceResult: DINT;
	uliTheTotalIs: ULINT;
	rTotalMB: REAL;
	uliTheFreeIs: ULINT;
	dFreeSpaceResult: DINT;
	rFreeMB: REAL;
	rPercentAvailable: REAL;
	sTemp: STRING;
	bDoIt: BOOL;
	bFileCopyDone: BOOL;
	bFileCopyBusy: BOOL;
	bFileCopyError: BOOL;
	bFileCopyErrorEnum: DataFileCopyError;
	MyDataFileCopy: DataFileCopy;
	baMyBytes: ARRAY[0..99] OF BYTE;
END_VAR

Code:

//What is the status of the SD card?
bla := PLC_R.i_wSdCardStatus;
IF bla = SDCARD_READWRITE THEN  //If the card isn't there this crashes stuff..
	//What is its label?
	dResult := FC_GetLabel(i_sVolumeName:='/sd0' , iq_sLabel:= sBla);
	//What is the size of the SD Card?
	dTotalSpaceResult := FC_GetTotalDiskSpace(i_sVolumeName:= '/sd0', iq_uliTotalDiskSpace:= uliTheTotalIs);
	rTotalMB := ULINT_TO_REAL(uliTheTotalIs) / 1048576.0; //convert to MB
	//How much space is left?
	dFreeSpaceResult := FC_GetFreeDiskSpace(i_sVolumeName:= '/sd0', iq_uliFreeDiskSpace:= uliTheFreeIs);
	rFreeMB := ULINT_TO_REAL(uliTheFreeIs) / 1048576.0;
	//What percentage is that?
	rPercentAvailable := rFreeMB / rTotalMB * 100.0;
END_IF

//Lets write some data to the SD card
sTemp := 'This is a test of the emergency broadcast system';

MyDataFileCopy(
	xExecute:= bDoIt, 
	sFileName:= 'BLABLA', 
	xRead:= FALSE, //Write from memory to the controller 
	xSecure:= FALSE, 
	iLocation:= 1, //1 = the SD card
	uiSize:= LEN(sTemp), 
	dwAdd:= ADR(sTemp),
	xDone=> bFileCopyDone, 
	xBusy=> bFileCopyBusy, 
	xError=>bFileCopyError , 
	eError=> bFileCopyErrorEnum);
	
	IF bFileCopyDone THEN
		bDoIt := false;
	END_IF