汇川APC系列,写汉字/中文到文件,可自定义文本类型,自定义打印文本长度

1.APC系列有默认的根目录,不可修改【C:\Program Files\Inovance PAC\RtosManager\InovanceTechnologies\WorkSpace\RtFiles\AppData\PlcLogic】,自定义的文件夹也是存在这个目录下

2.代码

1).文件操作功能块

FUNCTION_BLOCK FB_WriteContent2File
VAR_INPUT
	wsContent			:	WSTRING(MAX_WSTRING_LEN);
	sFolderName			:	STRING(80)	:=	'xx\Logs';		(* 文件夹名称:汇川AI系列默认路径:C:\Program Files\Inovance PAC\RtosManager\InovanceTechnologies\WorkSpace\RtFiles\AppData\PlcLogic *)
	sFileName			:	STRING(80)	:=	'SystemLog';	(* 文件名 -- 系统会默认加上系统时间:XXXX-XX-XX-XX *)
	sFileType			:	STRING(80)	:=	'.log';			(* 文件名后缀 *)
	bExecute			:	BOOL;							(* 功能触发 *)
END_VAR
VAR_OUTPUT
	bBusy				:	BOOL;
	bError				:	BOOL;
	nErrorID			:	WORD;
	wsErrorMsg			:	WSTRING(255);
END_VAR
VAR
	nStep				:	UINT;
	rtExecute			:	R_TRIG;	
	sSystemDate			:	STRING(80);
	sSystemTime			:	STRING(80);
	sTpPath				:	STRING(80);
	
	{region '文件操作使用'}
	nFileID				:	DWORD;
	fbFolderCreat		:	DirCreate;
	fbFileClose			:	FileClose;
	fbFileOpen			: 	FileOpen;
	fbFileWrite			: 	FileWrite;
	{endregion}

	arUtf8Byte			:	ARRAY[1..(MAX_WSTRING_LEN * 3 + 3)] OF BYTE;	(* wstring转UTF8格式单位最大占3个字节 *)
	nWriteLength		:	INT;

	{region ' 系统时间 '}
	nYear				:	UINT;
	nMonth				:	UINT;
	nDay				:	UINT;
	nHour				:	UINT;
	{endregion}
END_VAR


{region '控制流程'}
rtExecute(CLK := bExecute);

IF NOT bExecute THEN
	bBusy := FALSE;
	bError := FALSE;
	wsErrorMsg := "";
	nStep := 0;
	RETURN;
END_IF
IF rtExecute.Q AND NOT bBusy THEN
	bBusy := TRUE;
	bError := FALSE;
	wsErrorMsg := "";
	nStep := 50;
END_IF

CASE nStep OF
	50: (* 判断输入的内容是否为空,如果为空,退出,默认不打印 *)	
		IF wsContent = "" THEN
			nStep := 8888;
		ELSE
			CmpHCUtils.GetSystemDate(uiYear=> nYear, uiMonth=> nMonth, uiDay=> nDay, uiHour=> nHour);
			sSystemDate := CONCAT(CONCAT(CONCAT(CONCAT(TO_STRING(nYear), '-'), TO_STRING(nMonth)), '-'), TO_STRING(nDay));
			sSystemTime	:= CONCAT(CONCAT(sSystemDate, '-'), TO_STRING(nHour));
			sTpPath := CONCAT(CONCAT(sFolderName, '\'), sSystemDate);
			nStep := 100;
		END_IF
		
	100: (* 创建文件夹 *)
		fbFolderCreat(Execute:= TRUE, DirName:= sTpPath);
		IF NOT fbFolderCreat.Busy THEN
			IF NOT fbFolderCreat.Error THEN
				nStep := 200;
			ELSIF fbFolderCreat.ErrorID = 18 THEN	(* 文件夹已经存在 *)
				nStep := 200;
			ELSE
				nErrorID := fbFolderCreat.ErrorID;
				wsErrorMsg := Standard64.WCONCAT("Creat Folder error, [DirCreate]ErrorID: ", TO_WSTRING(fbFolderCreat.ErrorID));
				nStep := 9999;
			END_IF
			fbFolderCreat(Execute:= FALSE);		
		END_IF
		
	200: (* 打开之前执行一次关闭文件夹 *)
		sTpPath := CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(sTpPath, '\'), sFileName), '  '), sSystemTime), sFileType);
		IF  nFileID <> 0 THEN
			fbFileClose(Execute:= TRUE, FileID:= nFileID);
			IF NOT fbFileClose.Busy THEN
				IF NOT fbFileClose.Error THEN
					nStep := 300;
				ELSIF fbFileClose.ErrorID = 16 THEN		(* 文件不存在 *)
					nStep := 300;
				ELSE
					nErrorID := fbFileClose.ErrorID;
					wsErrorMsg := Standard64.WCONCAT("Colse File error, [FileClose]ErrorID: ", TO_WSTRING(fbFileClose.ErrorID));
					nStep := 9999;
				END_IF
				fbFileClose(Execute:= FALSE);		
			END_IF
		ELSE
			nStep := 300;
		END_IF
		
	300: (* 打开文件 *)
		fbFileOpen(Execute:= TRUE, FileName:= sTpPath, Mode:= HC_OmronUtils.ACCESS_MODE.AM_APPEND_PLUS, FileID=> nFileID);	
		IF NOT fbFileOpen.Busy THEN
			IF NOT fbFileOpen.Error THEN
				WSTRING_TO_UTF8(wsContent:= wsContent, arUtf8Byte=> arUtf8Byte, nLen=> nWriteLength);
				nStep := 400;
			ELSE
				nErrorID := fbFileOpen.ErrorID;
				wsErrorMsg := Standard64.WCONCAT("Open File error, [FileOpen]ErrorID: ", TO_WSTRING(fbFileOpen.ErrorID));
				nStep := 9999;
			END_IF
			fbFileOpen(Execute:= FALSE);		
		END_IF
		
	400: (* 写入数据 *)
		fbFileWrite(Execute:= TRUE, FileID:= nFileID, WriteBuf:= (arUtf8Byte[1]), Size:= TO_UINT(nWriteLength));
		IF NOT fbFileWrite.Busy THEN
			IF NOT fbFileWrite.Error THEN
				nStep := 500;
			ELSE
				nErrorID := fbFileWrite.ErrorID;
				wsErrorMsg := Standard64.WCONCAT("File Write error, [FileWrite]ErrorID: ", TO_WSTRING(fbFileWrite.ErrorID));
				nStep := 9999;
			END_IF
			fbFileWrite(Execute:= FALSE);		
		END_IF
		
	500: (* 关闭文件 *)
		IF  nFileID <> 0 THEN
			fbFileClose(Execute:= TRUE, FileID:= nFileID);
			IF NOT fbFileClose.Busy THEN
				IF NOT fbFileClose.Error THEN
					nStep := 8888;
				ELSIF fbFileClose.ErrorID = 16 THEN		(* 文件不存在 *)
					nStep := 8888;
				ELSE
					nErrorID := fbFileClose.ErrorID;
					wsErrorMsg := Standard64.WCONCAT("Colse File error, [FileClose]ErrorID: ", TO_WSTRING(fbFileClose.ErrorID));
					nStep := 9999;
				END_IF
				fbFileClose(Execute:= FALSE);		
			END_IF
		ELSE
			nStep := 8888;
		END_IF
		
	8888: (* 正常结束流程 *)
		bBusy := FALSE;
		bError := FALSE;
		nStep := 0;
		
	9999: (* 异常结束流程步 *)
		bBusy := FALSE;
		bError := TRUE;
		nStep := 0;
END_CASE
{endregion}

2).自定义功能:WSTRING_TO_UTF8

FUNCTION WSTRING_TO_UTF8 : UINT
VAR_INPUT
	wsContent			: 	WSTRING(MAX_WSTRING_LEN);
END_VAR
VAR_OUTPUT
	nLen				:	INT;											(* BYTE数组的有效长度 *)
	arUtf8Byte			:	ARRAY[1..((MAX_WSTRING_LEN * 3 ) + 3)] OF BYTE;	(* wstring转UTF8格式单位最大占3个字节 *)
END_VAR
VAR
	i					:	INT;
END_VAR


{region ' 初始化数据 '} 
nLen := 0;
MemSet(pbyDest:= ADR(arUtf8Byte), byValue:= 0,dwSize:= SIZEOF(arUtf8Byte));
{endregion}

{region ' 数据转换 '}
ConvertUTF16toUTF8(sourceStart:= ADR(wsContent[0]), targetStart:= ADR(arUtf8Byte), dwTargetBufferSize:= SIZEOF(arUtf8Byte), bStrictConversion:= TRUE);	
FOR i := 1 TO TO_INT((MAX_WSTRING_LEN * 3 ) + 3) BY 1 DO
	IF arUtf8Byte[i] <> 0 THEN
		nLen := nLen + 1;
	ELSE
		EXIT;
	END_IF
END_FOR

nLen := nLen + 1;
arUtf8Byte[nLen] := 10;	(* 换行符号 *)

3.实列调用

VAR	
	bStartTest		:	BOOL;
	wsTestContent	:	WSTRING(MAX_WSTRING_LEN);
	fbWrite2File	:	FB_WriteContent2File;
END_VAR

fbWrite2File(wsContent:= wsTestContent, bExecute:= bStartTest);
IF bStartTest AND NOT fbWrite2File.bBusy THEN
	bStartTest := FALSE;
END_IF


4.测试结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Awby1228

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值