《大族激光打标机接口使用手册V1.2.docx》由会员分享,可在线阅读,更多相关《大族激光打标机接口使用手册V1.2.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、二次开发软件接口使用手册 V1.2HANS 二次开发软件接口使用手册(V1.2)版本号修订日期修订人变更记录1.02010.10.10初版1.12010.12.01根据富士康需求,增加 Unicode、取错误接口.1.22011.02.16根据定制部门的需求、增加对象及文档操作接口,提供更丰富的应用一、概述本动态库基于 Hans Laser Marking Software V5.3 进行开发,用于满足以下情况下一些高级用户的特殊需要。1、打标系统只是客户系统的一部分,且客户具有较强的开发能力,希望将打标系统完全集成到他们自己的系统中。2、海外非标准用户,由于存在沟通和出差的问题,使用这种方式
2、可以有效地解决一些自动化应用的问题。3、其它行业或中心可以基于本动态库开发他们自己的打标系统。本动态库和打标软件一样,只支持 EMCC 卡。本动态库采用和 Windows 相同的API 方式导出接口,函数使用 stdcall 声明,可以供 VC+、VB、Delphi、C+ Builder、C等多种开发工具使用,使用者需要显示调用,显示调用的方法如下:1、调用Windows API 函数 LoadLibrary()动态加载 DLL。2、调用WindowsAPI 函数 GetProcAddress()取得要调用函数的指针。 3、用函数指针调用DLL 中函数完成相应功能。4、程序结束或不再使用时,调
3、用 WindowsAPI 函数 FreeLibrary()释放动态库。软件接口动态库名:HansAdvInterface.dll软件提供完整安装盘,按照安装步骤安装完成后,即可正常使用,在使用之前,需要进入标准软件进行相关参数的设置,如 BOX 校正、打标位置校正、激光器设置等。注: 软件接口和打标软件是不能同时使用的,如果打标软件正在使用,通过接口初始化设备时会返回错误码 1(另一个程序在运行),这种情况下需要关闭打标软件或校正软件。二、返回值及结构体定义所有函数返回值均为一个整形的通用错误码,码值定义如下#defineHL_ERR_SUCCESS0/成功#defineHL_ERR_PROG
4、RUN1/另一个程序在运行#defineHL_ERR_PATH2/路径不正确#defineHL_ERR_FAILOPEN3/初始化失败#defineHL_ERR_ NOINITIAL4/未初始化#defineHL_ERR_WARNING5/报警#defineHL_ERR_OVERTIME6/命令超时第 9 页 共 16 页#defineHL_ERR_READFILE7/无法读取文件#defineHL_ERR_NOFINDFONT8/指定的字体不存在#defineHL_ERR_NOPEN9/指定的层号不存在#defineHL_ERR_NOOBJECT10/没找到指定的对象#defineHL_ER
5、R_PARAM11/参数非法#defineHL_ERR_STATUS12/错误的状态,当前状态下不能执行此操作#defineHL_ERR_ALLOCMEMORY13/分配内存失败#defineHL_ERR_OVERRANGE14/打标范围超限#defineHL_ERR_BUFFERSIZE15/缓冲区不够#defineHL_ERR_NULLPTR16/空指针#defineHL_ERR_NODOC17/未找到指定文档#defineHL_ERR_UNKNOWN100/未知错误#defineWM_TOUCH_MSG(WM_USER+1095)/主动检测脚踏触发消息/填充参数结构体定义struct b
6、aseHatchBOOLbEnable;/填充使能BOOLbEquaDist;/等间距使能BOOLbKeepAngle;/填充线绕轮廓旋转intnFillStyle;/填充类型doubledbSpace;/填充间距doubledbAngle;/填充角度doubledbBeamComp;/光栅大小doubledbLineReduce;/线缩进量doubledbStartOffset;/起始缩进量doubledbEndOffset;/末尾缩进量doubledbMinJump;/最小跳转间距BOOLbLoop;/缩扩使能intnLoopNum;/缩扩圈数doubledbLoopDist;/缩扩间距B
7、OOLbRemoveLine;/缩扩后去掉填充线BOOLbRemoveOrg;/缩扩后去掉原始轮廓intnFillNum;/填充次数doubleProAngle;/累进角度doubleAddDis;/累进间距BOOLbSaveCountour;/累进填充时是否保留边框BaseHach;typedef struct HATCH_PARABaseHachhatch1; BaseHachhatch2;BOOL bFillFirst; HATCHPARA,*LP_HATCHPARA;/字体参数结构体定义Typedef structFONT_PARAintnFontType;/字体类型 0-TTF,1-
8、SHX,2-HANS,3-DOTBYTEnCharSet;/字符集,Unicode 编码时用charszFontName100;/TTF、HANS 字体用charszShxCN 100;/SHX、DOT 字中文字体用charszShxEN100;/ SHX、DOT 字英文字体用charszShxNum 100; FONTPARA,*LP_FONTPARA;/层参数结构体定义Typedef struct LAYER_PARAintnCount;/ 打标次数double dbMarkV;/矢量打标速度(mm/s) double dbJumpV;/矢量空跳速度(mm/s) double dbQFre
9、q;/Q 频(KHz)doubledbQRls;/Q 释放(us) double dbCurrent;/电流(A)intnFpkTime;/首脉冲抑制时间 double dbFPKInitRate; /首点比例(0.01.0)double dbFPKLenRate; /抑制长度系数(0.00.999) double dbFPKMaxPRate;/峰值能量比例(0.01.0) doubledbFPKCurRate; /首脉冲电流系数(0.01.0) intnQuality;/打标质量系数intnLayerDelay;/层延时intnLaserOnDelay; /激光开延时(us) intnLas
10、erOffDelay; /激光关延时(us) intnMoveLineDelay;/走笔延时(us) intnJumpDelay;/跳转延时(us) intnCornerDelay;/拐弯延时(us) double dbCurrentR;/电流(%) double dbSimmerCur;/维持电流(%) intnWaveForm;/波形doubledbPowerR;/功率(%) LAYERPARA,*LP_LAYERPARA;/电机运动参数结构体定义typedef struct MOTOR_PARAWORDnVer;/版本号,预留 0/WORDnAxis;/轴号WORDnMoveMode;/
11、运动模式:0-绝对运动,1-相对运动 LONGnMovePos;/运动量或位置UINTnMoveSpeed;/运动速度(脉冲/秒) UINTnMoveAcc;/加速度(递增脉冲/秒) UINTnDelay;/运动后延时*LP_MOTOR_PARA;三、函数说明*A、通用部分,所有用户均可使用*1、HS_GetDllVersion语法:int HS_GetDllVersion(WORD* pMainVer,WORD *pDllVer)作用:获取Dll 版本及其所需主程序版本信息,版本信息由三段组成,共位,从高到低分别分配 4、位,如主程序版本号为 20869,二进制排列为 0101 00011
12、0000101,解析结果为 V5.3.5。参数描述:pMainVer:主版本号,DLL 所依附主程序的版本号,必须安装此版本的程序DLL才能正常工作。pDllVer:子版本号,DLL 内部版本号,区分不同的 DLL。2、HS_InitialMachine语法:int HS_InitialMachine(LPCTSTR pszPath)作用:初始化控制系统参数描述:库文件所在路径,pszPath 为空指针时取内部默认路径3、HS_CloseMachine语法:int HS_CloseMachine()作用:关闭控制系统参数描述:无4、HS_GetMarkRange语法:int HS_GetMar
13、kRange(double *pX,double *pY);作用:获取打标范围。参数描述:pX:Box方向大小(mm)。pY:BoxY 方向大小(mm)。5、HS_LoadMarkFile语法:int HS_LoadMarkFile(LPCTSTR pszFileName)作用:加载打标文件,如果成功,自动设置该文档为当前工作文档。参数描述:pszFileName:打标文件完整路径及名称。6、HS_GetDocList语法:int HS_GetDocList(TCHAR szDocList50, int* pCount)作用:获取当前所有已打开文档列表,文档名不允许超过 50Bytes。 参数
14、描述:szDocList:文档列表指针。pCount:传入缓冲区数组大小,处理完成后返回实际获取文档数。7、HS_SetCurDoc语法:int HS_SetCurDoc(LPCTSTR lpszDocName);作用:设置当前工作文档。参数描述:lpszDocName:文档名称(不含后缀.HS 和路径)。8、HS_SaveMarkFile语法:int HS_SaveMarkFile(LPCTSTR lpszFile)作用:保存打标文件,需要传入完整路径及文件名。参数描述:lpszFile:完整路径及文件名,如果为 NULL,则按文件打开时的路径及文件名保存。9、HS_CloseMarkFil
15、e语法:int HS_CloseMarkFile(LPCTSTR lpszFile,BOOL bSave)作用:保存及关闭打标文档。参数描述:lpszFile: 文档名称(不含后缀.HS 和路径)。bSave:关闭时是否保存当前文档,按原文件保存。注默认文档不允许关闭,只能关闭通过接口打开的文档。10、HS_IsTouch语法:intHS_IsTouch(int* pTouchFlag)作用:上位机查询检测脚踏,检测效率较低,间隙较短时可能会漏检。参数描述:pTouchFlag:信号标志位,1-触发,0-未触发注: 硬件设置中脚踏部分设置对此接口有效,如触发电平、几个信号触发一次等。11、HS
16、_CheckTouch语法:int HS_CheckTouch(HWND hWnd,BOOL bActive)作用:快速脚踏检测,由下位机实时检测,一旦检测到脚踏信号,会向指定窗口发 TOUCH消息,可以检测到很短间隙的信号,高端需求时用。参数描述:hWnd:信号触发后,接收 WM_TOUCH_MSG 消息的窗口bActive:激活或关闭主动检测。注: 关闭主动检测后可用 HS_IsTouch 或 HS_ReadPort 检测 TOUCH 信号。12、HS_Mark语法:int HS_Mark(int nType,BOOL bWaitTouch,BOOL bWaitEnd, int nOver
17、Time,BOOL bMarkAll)作用:打标参数描述:nType 打标类型 0-正常打标,1-红光预览bWaitTouch 是否等待脚踏信号,TRUE-检测到信号后才打标,FALSE-立即打标 bWaitEnd是否阻塞,TRUE-打标结束后才返回,FALSE-不阻塞,立即返回 nOverTime 等待脚踏信号超时时间(ms)bMarkAll是否全部打标(TRUE-全部,FALSE-选择部分)13、HS_IsMarkEnd语法:int HS_IsMarkEnd(int* pFlag)作用:检测打标是否结束(HS_Mark 非阻塞调用时)。参数描述:pFlag 打标标志,0-正在打标,1-打标
18、正常结束,2-打标中止结束,3-设备异常打标结束14、HS_MarkPause语法:int HS_MarkPause()作用:打标暂停参数描述:无15、HS_Remark语法:int HS_Remark()作用:暂停后恢复打标参数描述:无16、HS_MarkStop语法:int HS_MarkStop()作用:中止打标参数描述:无17、HS_GetMarkTime语法:int HS_GetMarkTime(UINT *pMarkTime);作用:获取最后一次打标时间。参数描述:pMarkTime:打标时间(ms)18、HS_ChangeTextByName语法:int HS_ChangeTex
19、tByName(LPCTSTR lpszTextName, LPCTSTR lpszText)作用:改变文本内容参数描述:lpszTextName:可变文本别名 lpszText:文本内容19、HS_ChangeTextByNameW语法:int HS_ChangeTextByNameW(LPCTSTR lpszName, LPCWSTRlpszTextValue)作用:改变文本内容(UNICODE 编码)参数描述:lpszTextName:可变文本别名 lpszText:文本内容20、HS_GetTextByName语法:int HS_GetTextByName(LPCTSTR lpszTe
20、xtName, LPTSTR lpszText, int*pMaxCount )作用:获取可变文本内容参数描述:lpszTextName:可变文本别名 lpszText:接收文本内容的缓冲区pMaxCount:接收缓冲区的字节数,如果接收长度超过缓冲区大小,该参数返回接收内容的长度。注: 如果缓冲区太小,pMaxCount 返回实际需要的大小。21、HS_GetTextByNameW语法:int HS_GetTextByNameW(LPCTSTR lpszName, LPWSTR lpszText, int* pMaxCount)作用:获取可变文本内容(UNICODE 编码)参数描述:lpsz
21、TextName:可变文本别名 lpszText: 接收文本内容的缓冲区pMaxCount:接收缓冲区的字节数,如果接收长度超过缓冲区大小,该参数返回接收内容的长度。注: pMaxCount 返回实际需要的缓冲区大小22、HS_ReadPort语法:int HS_ReadPort(DWORD* pValue)作用:获取 IO 输入状态参数描述:pValue:输入口状态值 23、HS_WritePort语法:int HS_WritePort(DWORD dwValue,DWORD dwMask)作用:输出 IO 信号参数描述:dwValue:输出信号值dwMask:有效信号掩码,掩码位为 1 的
22、信号才输出,0xFFFFFFFF 输出全部信号24、HS_SetDevCfg语法:int HS_SetDevCfg()作用:弹出系统设置对话框,设置硬件参数参数描述:无25、HS_PreviewGraph语法:int HS_PreviewGraph(HWND hWnd,double dbCenterX,doubledbCenterY,double dbScale)作用:预览当前打标内容参数描述:hWnd:在指定的窗口中显示打标内容 dbCenterX:显示中心点X 坐标,默认 0。 dbCenterY:显示中心点Y 坐标,默认 0。dbScale:预览缩放系数,默认 1.0,大于 1 时放大显
23、示,小于时缩小显示。26、HS_SetHatchPara语法:int HS_SetHatchPara(LPVOIDpPara)作用:设置填充参数参数描述:pPara:填充参数数据指针,见 HATCHPARA 定义27、HS_GetHatchPara语法:int HS_GetHatchPara(LPVOID pPara)作用:获取当前填充参数参数描述:pPara:填充参数数据指针,见 HATCHPARA 定义28、HS_SetFontPara语法:int HS_SetFontPara(LPVOID pPara)作用:设置字体参数参数描述:pPara:字体参数数据指针,见 FONTPARA 定义2
24、9、HS_GetFontPara语法:int HS_GetFontPara(LPVOID pPara)作用:获取当前字体参数参数描述:pPara:字体参数数据指针,见 FONTPARA 定义30、HS_SetLayerPara语法:int HS_SetLayerPara(int nLayer, LPVOID pPara)作用:设置指定层参数参数描述:nLayer:当前要设置层层号。pPara:层参数数据指针,详见 LAYERPARA 定义。31、HS_GetLayerPara语法:int HS_GetLayerPara(int nLayer, LPVOID pPara)作用:获取指定层参数信息
25、参数描述:nLayer:当前要获取层层号。pPara:层参数数据指针,详见 LAYERPARA 定义。32、HS_ImportVectorFile语法:int HS_ImportVectorFile(LPCTSTR lpszFileName, double dbPosX,double dbPosY,double dbWidth, double dbHeight, double dbRotate,BOOL bHatch,int nHatchLayer, LPCTSTR lpszObjName)作用:导入矢量图形文件参数描述:lpszFileName:导入文件名称,通过后缀名识别类型(Plt、DX
26、F) dbPosX,dbPosY: 导入后图形放置位置dbWidth:导入后图形缩放大小 dbHeight:导入后图形缩放宽度 dbRotate:导入后图形旋转角度 bHatch:是否填充 nHatchLayer: 填充层号 lpszObjName: 对象名称33、HS_ImportImageFile语法:int HS_ImportImageFile(LPCTSTR lpszFileName, double dbPosX,double dbPosY,double dbWidth,double dbHeight,double dbRotate,int nMarkType, double dbDo
27、tDistX,double dbDotDistY, int nAccDot,BOOL bReciprocate, int nRepairDot, LPCTSTR lpszObjName )作用:导入位图图形文件参数描述:lpszFileName:导入文件名称,通过后缀名识别类型dbPosX,dbPosY: 导入后图形放置位置dbWidth:导入后图形缩放大小dbHeight:导入后图形缩放宽度dbRotate:导入后图形旋转角度二次开发软件接口使用手册 V1.2nMarkType:位图打标类型 0 灰度位图,1-二值位图 dbDotDistX:位图X 点距dbDotDistY:位图 Y 点距l
28、pszObjName:对象名称以下参数只有打标类型为灰度位图有效,二值位图无效nAccDot:加速点个数 bReciprocate: 往复扫描 nRepairDot:补偿点个数注: 由于灰度位图打标参数调节很复杂,因此灰度位图的调节需要通过打标软件进行调节,库内部会调用已经调好的参数,不再额外提供开发接口。34、HS_AddText语法:int HS_AddText(LPCTSTR lpszStr, double dbHeight, doubledbWidthRatio,BOOL bModel, LPCTSTR pszName,double dbPosX,double dbPosY, int
29、nAlign, double dbAngle, int nLayer, BOOL bHatch,int nHatchLayer, LPCTSTR lpszObjName)作用:添加文本数据参数描述:lpszStr:文本内容dbHeight:文本高度 dbWidthRatio: 宽度系数 bModel:是否是可变文本pszName:可变文本别名dbPosX:文本X 位置dbPosY:文本 Y 位置nAlign:排列方式dbAngle:旋转角度nLayer:边框层号bHatch: 是否填充 nHatchLayer: 填充层号 lpszObjName: 对象名称35、HS_AddBarcode语法:
30、int HS_AddBarcode(LPCTSTR lpszStr, int nBarType, double dbHeight,doubledbPosX, double dbPosY, double dbAngle, int nAlign, int nLayerNo, double dbBarRatio, double dbLineDist, double dbShrink, BOOL bReverse, double dbRevWidth, double dbRevHeight, BOOL bModel, LPCTSTR lpszTextName, LPCTSTR lpszObjName)
31、作用:添加条码数据参数描述:lpszStr:条码内容第 16 页 共 16 页nBarType:条码类型0 - EAN8,1 - EAN13 ,2 - EAN128 ,3 - CODE128A,4- CODE128B,5 - CODE128C,6 - CODE128AUTO,7 - CODE39 ,8 - INT25,9 - EXT39 ,10 - UPCA,11 - UPCE,12 - PDF417,13 - DATAMATRIX14- QRdbHeight:条码高度dbPosX:条码X 位置dbPosY:条码 Y 位置dbAngle:旋转角nAlign:排列方式nLayerNo:层号 db
32、BarRatio:宽窄比 dbLineDist: 线间距 dbShrink:: 缩进量 bReverse:条码是否反填 dbRevWidth:反填宽度(mm)dbRevHeight: 反填高度(mm,为 0 时不反填) bModel:是否可变文本 lpszTextName:可变文本别名lpszObjName:对象名称36、HS_AddCurve语法:int HS_AddCurve( double ptBuf2,int nPtNum,int nLayer,BOOL bHatch,intnHatchLayer, LPCTSTR lpszObjName)作用:添加曲线数据参数描述:ptBuf:曲线点
33、数组 nPtNum:点个数 nLayer:使用层号 bHatch:是否填充 nHatchLayer:填充层号 lpszObjName: 对象名称37、HS_AddDotMatrix语法:int HS_AddDotMatrix(double ptBuf2,int nPtNum,int nLayer, LPCTSTRlpszObjName)作用:添加点阵数据参数描述:ptBuf:曲线点数组 nPtNum:点个数 nLayer:使用层号 lpszObjName: 对象名称38、HS_GetObjList语法:int HS_GetObjList(TCHAR szObjList50,int* pCoun
34、t)作用:获取当前工作文档中对象列表。参数描述:szObjList:对象名称列表指针。pCount:传入缓冲区数组大小,处理完成后返回实际获取对象数。39、HS_SelectObjects语法:int HS_SelectObjects(LPCTSTR lpszObjName, BOOL bSelected)作用:选择/不选择指定对象,选中对象后,可对选中对象进行打标、移动、旋转、切变、阵列、提取属性、删除等操作。参数描述:lpszObjName:对象名称,如果为 NULL,则对全部对象进行操作。 bSelected:是否选择,TRUE-选择,FALSE不选择。40、HS_ClearObject
35、s语法:int HS_ClearObjects()作用:删除当前选中对象。 参数描述: 无41、HS_Move语法:int HS_Move( double dbMoveX,double dbMoveY)作用:对当前选中对象进行移动操作。参数描述:dbMoveX:移动量(mm)。 dbMoveY:Y 移动量(mm)。42、HS_Rotate语法:int HS_Rotate(double x,double y,double dbRotate)作用:对当前选中对象进行旋转操作。参数描述:x:旋转基准点X 坐标。y:旋转基准点 Y 坐标。dbRotate:旋转角度(度)43、HS_Shear语法:in
36、t HS_Shear( double dbBaseX,double dbBaseY, double dbAngleX,double dbAngleY)作用:对当前选中对象进行切变操作。参数描述:dbBaseX: X 轴切变位置。 dbBaseY: Y 轴切变位置。 dbAngleX:切变角度(度)。 dbAngleY:切变角度(度)。44、HS_Scale语法:int HS_Scale(double x,double y,double dbScaleX,double dbScaleY)作用:对当前选中对象进行缩放操作。参数描述:x:基准点X 坐标。y:基准点 Y 坐标。 dbScaleX:缩放
37、系数。 dbScaleY:缩放系数。45、HS_Array语法:int HS_Array(double ptArray2,int nSize)作用:对当前选中对象进行阵列操作。参数描述:ptArray:阵列位置坐标数组。 nSize:阵列数组大小。46、HS_GetObjProperty语法:int HS_GetObjProperty(double* pLeft,double *pTop,double *pRight,double*pBottom)作用:获取当前选中对象的属性,返回对象 Quadl,t,r,b的信息。参数描述:pLeft: Quad left 坐标 pTop:Quadtop 坐
38、标。 pRight: Quad right 坐标。 pBottom:Quad bottom 坐标。47、HS_IGotoXYZ语法:int HS_IGotoXYZ(int nType, double dbX,double dbY, double dbZ)作用:立即指令,移动XYZ 轴到指定位置(XY-指振镜,Z 指三维调焦)参数描述:nType:(类型 0- 只移动 XY,1-只移动 Z,2-三轴同时移动) dbX: (X 移动目标位置坐标,mm)dbY: (Y 移动目标位置坐标,mm)dbZ: (Z 移动目标位置,范围 0-65535)48、HS_MoveMotor语法:int HS_Mov
39、eMotor(LPVOID pPara)作用:电机单轴运动。参数描述:pPara:运动参数,详见定义49、HS_ILaserOn语法:int HS_ILaserOn(double dbQFrq,double dbQRls,double dbCurrentA,double dbPower)作用:立即指令,开激光参数描述:dbQFrq:Q 频, dbQRls:Q 释放时间dbCurrentA:激光工作电流(),调类激光器用。 dbPower:激光工作功率(%),IPG、SPI 激光器用。50、HS_ILaserOff()语法:int HS_ILaserOff()作用:立即指令,关激光参数描述:无5
40、1、HS_GetLastError语法:int HS_GetLastError(int* pError, LPTSTR lpszMsg, int nSize)作用:获取最近一次错误码及其详细错误信息参数描述:pError: 错误码lpszMsg:保存错误信息的缓冲区 nSize:错误信息缓冲区大小*B、高级应用,部分应用需要授权*高级应用需要的数据定义:/对外接口点数据结构class CInterDotpublic:CInterDot()x = 0;y = 0;z = 0;CInterDot(double x1,double y1)x = x1; y = y1;CInterDot(double
41、 x1,double y1,double z1)x = x1;y = y1;z = z1;CInterDot & operator=(const CInterDot &dot)if ( this = &dot ) return *this;elsex = dot.x;y = dot.y;z = dot.z;public:return *this;doublex;/xdoubley;/ydoublez;/z (3D预留);/对外接口线条数据类class CInterStroke: public CObjectpublic:CInterStroke()m_nLayer = 0; m_dotArra
42、y.RemoveAll();virtual CInterStroke () m_dotArray.RemoveAll();void AddDot(CInterDot& dot) m_dotArray.Add(dot);void SetLayer( int nLayer ) m_nLayer = nLayer;CInterStroke & operator=(const CInterStroke &stroke)if ( this = &stroke )elsereturn *this;m_nLayer = stroke.m_nLayer; m_dotArray.RemoveAll(); m_d
43、otArray.Append(stroke.m_dotArray);return *this;public:CArray m_dotArray; intm_nLayer;/对外接口线条数据链表typedef CTypedPtrList InterStrokeList;52、HS_GetStrokeList语法:int HS_GetStrokeList(LPCTSTR lpszObjName,LPVOID pList)作用:获取当前指定对象的线条数据,DLL 内部分配内存,外部用完后自行释放。参数说明:lpszObjName:指定对象名称,NULL 时取全部对象。pList:存放提取的线条数据,详见 InterStrokeList 定义。53、HS_MarkStorke