[开源] PLC梯形图转指令表的算法源代码

本文档提供了一个MFC MDI应用程序的源代码详细解析,重点介绍了IOPOINT类及其子类的功能实现,包括各类元件如LD、LDI、OR等的绘制方法及语法编译过程。此外还涉及了PLC类的实现细节,如插入和删除节点的方法,以及如何进行语法检查和编译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这份代码仅仅是简陋的梯形图编辑界面、指令转换功能,仅供学习参考!

在网上不可能找到一份完整商业版的PLC软件!!!

//

本源码来自ourdev论坛,当初自己就是看这套代码,一直从第一行"骂"到最后一行,得狠狠地bs这个不带任何注释的作者,虽然“开源”的精神值得学习.....

下载地址  http://download.youkuaiyun.com/detail/wangningyu/7626427

[ MFC-MDI ] 源代码下载:http://cache.ourdev.cn/bbs_upload489681/files_11/ourdev_545797.rar

下载不了的话请邮件联系koma0769#vip.qq.com(替换#为@)

注释没有加完,走马观花一番,关键是两个Compile函数需要花点时间研究,有兴趣的看看!

//File plc.h
#ifndef __PLC8_H
#define __PLC8_H
#define m_nAreRow 100
#define m_nAreCol 16

class CIO:public CObject
{
	DECLARE_SERIAL(CIO);
public:
	virtual void Serialize(CArchive &ar);	// 文档串行化
	CString name;
	CString addr;
	CString code;
	int Rows;
	int Cols;
	int flag;
	int fiveflag;
	int xpoint;
	int ypoint;
	CIO();
};

class IOPOINT:public CObject
{
	friend class LIST;
	friend class PLC;
protected:
	CString name;			// 元件名称
	CString code;			// 元件生成的代码()
	CString addr;			// 元件地址(操作数)
	int  xpoint,ypoint;		// 元件x、y坐标
	int  flag;				// 上下左右连接关系
	int  fiveflag;			// 图符的索引号,图符的唯一标记
	BOOL visit;				// 
	IOPOINT *right;			// 链表向右
	IOPOINT *down;			// 链表向下
	IOPOINT *left;			// 链表向左
	IOPOINT *up;			// 链表向上
	IOPOINT *unup;			// 压栈操作
	IOPOINT *undown;		// 未知图符
public:
	IOPOINT(int x,int y,int fl,CString cd="",CString nm="",CString ad="")
	{
		name=nm;
		code=cd;
		addr=ad;
		flag=fl;
		fiveflag=0;
		visit=FALSE;
		xpoint=x;
		ypoint=y;
		right=0;
		left=0;
		up=0;
		down=0;
		unup=0;
		undown=0;
	}
	IOPOINT()
	{
		name="";
		code="";
		addr="";
		flag=0;
		fiveflag=0;
		visit=FALSE;
		xpoint=0;
		ypoint=0;
		right=0;
		left=0;
		up=0;
		down=0;
		unup=0;
		undown=0;
	}
	void setname(const CString ioname)
	{
		name=ioname;
	}	
	void setaddr(const CString ioaddr)		// 设置地址
	{
		addr=ioaddr;
	}
	void setcode(const CString iocode)		// 设置生成的指令
	{
		code=iocode;
	}
	void setflag(int flg)
	{
		flag=flg;
	}
	void setfiveflag(int fivflg)
	{
		fiveflag=fivflg;
	}
	void setvisit(BOOL x)
	{
		visit=x;
	}
	void setwhere(int x,int y)
	{
		xpoint=x;
		ypoint=y;
	}
	void getname(CString *result_name)	// 获取元件名称
	{
		*result_name=name;
	}
	void getaddr(CString *result_addr)	// 获取无件地址
	{
		*result_addr=addr;
	}
	void getcode(CString *result_code)
	{
		*result_code=code;
	}
	int getflag()
	{
		return flag;
	}
	int getfiveflag()
	{
		return fiveflag;
	}
	int getxpoint()
	{
		return xpoint;
	}
	int getypoint()
	{
		return ypoint;
	}
	void changeimg(int,int,CDC *);
	virtual void setstatu() {}
	virtual void print(int x,int y,CDC *pDC)
	{
		changeimg(x,y,pDC);
	}
	virtual void put_img(int,int,CDC *){}
	virtual int testaddr();

};


class LD :public IOPOINT
{
public:
	LD(int x,int y,int flg,CString cd="LD",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{};
	LD():IOPOINT()
	{
		setcode("LD");					
	}
	void put_img(int x,int y,CDC *pDC);
	void print(int x,int y,CDC *pDC);
};
class LDI :public IOPOINT
{
public:
	LDI(int x,int y,int flg,CString cd="LDI",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{}
	LDI():IOPOINT()
	{
		setcode("LDI");
	}
	void put_img(int x,int y,CDC *pDC);
	void print(int x,int y,CDC *pDC);
};
class OR :public IOPOINT
{
public:
	OR(int x,int y,int flg,CString cd="OR",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{}
	OR():IOPOINT()
	{
		setcode("OR");
	}
	void put_img(int x,int y,CDC *pDC);
	void print(int x,int y,CDC *pDC);
};
class ORI :public IOPOINT
{
public:
	ORI(int x,int y,int flg,CString cd="ORI",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{}
	ORI():IOPOINT()
	{
		setcode("ORI");
	}
	void put_img(int x,int y,CDC *pDC);
	void print(int x,int y,CDC *pDC);
};
class HOR :public IOPOINT
{
public:
	HOR(int x,int y,int flg,CString cd="HOR",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{}
	HOR():IOPOINT()
	{}
	int testaddr();
	void print(int x,int y,CDC *pDC);
};
class ERECT :public IOPOINT
{
public:
	ERECT(int x,int y,int flg,CString cd="ERECT",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{}
	ERECT():IOPOINT()
	{}
	int testaddr()
	{
	 return 0;
	}
	void print(int x,int y,CDC *pDC);
};
class OUTPOINT :public IOPOINT
{
public:
	OUTPOINT(int x,int y,int flg,CString cd="OUT",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{}
	OUTPOINT():IOPOINT()
	{
		setcode("OUT");
	}
	int testaddr()
	{
	 return 0;
	}
	void put_img(int x,int y,CDC  *pDC);
	void print(int x,int y,CDC *pDC);
};
class ADDTION:public IOPOINT
{
public:
	ADDTION(int x,int y,int flg,CString cd="",CString nm="",CString ad="")
		:IOPOINT(x,y,flg,cd,nm,ad)
	{}
	ADDTION():IOPOINT()
	{}
	int testaddr();
	void put_img(int x,int y,CDC *pDC);
	void print(int x,int y,CDC *pDC);
};

class LIST:public CObject
{
	friend class PLC;
private:
	IOPOINT *root;
public:
	LIST()
	{
	  root=0;
	}
	IOPOINT * ANBtest(IOPOINT *p);
	IOPOINT * ANBcompile(IOPOINT *p,IOPOINT *endpoint);
	IOPOINT * ORBtest(IOPOINT *p,IOPOINT *q);
	IOPOINT * ORBcompile(IOPOINT *p);
	int compile(IOPOINT *);
};
class PLC:public CObject
{
	friend class CLADDoc;
private:
	int Cols;
	int Rows;
	IOPOINT * point_array[m_nAreRow][m_nAreCol];
	LIST  list_array[20];
	int step;	
public:
	IOPOINT * getpoint(int row,int col);
	int getcols();
	int getrows();
	void SetRowCol(int row,int col);
	PLC();
	void getstep();
	int syntax(CString &m_strlist);
	int testpoint(int row,int col);
	void insert_point(IOPOINT *n);
	void remove_point(int x,int y);
	int compiled(CString &m_strlist);
	void newfile();
};

#endif

React Hooks 是 React 16.8 中新增的特性,它可以让你在函数组件中使用 state、生命周期钩子等 React 特性。使用 Hooks 可以让你写出更简洁、可复用且易于测试的代码。 React Hooks 提供了一系列的 Hook 函数,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useImperativeHandle、useLayoutEffect 和 useDebugValue。每个 Hook 都有特定的用途,可以帮助你处理不同的问题。 下面是 React Hooks 的一些常用 Hook 函数: 1. useState useState 是最常用的 Hook 之一,它可以让你在函数组件中使用 state。useState 接受一个初始状态值,并返回一个数组,数组的第一个值是当前 state 值,第二个值是更新 state 值的函数。 ``` const [count, setCount] = useState(0); ``` 2. useEffect useEffect 可以让你在组件渲染后执行一些副作用操作,比如订阅事件、异步请求数据等。useEffect 接受两个参数,第一个参数是一个回调函数,第二个参数是一个数组,用于控制 useEffect 的执行时机。 ``` useEffect(() => { // 这里可以执行副作用操作 }, [dependencies]); ``` 3. useContext useContext 可以让你在组件树中获取 context 的值。它接受一个 context 对象,并返回该 context 的当前值。 ``` const value = useContext(MyContext); ``` 4. useRef useRef 可以让你在组件之间共享一个可变的引用。它返回一个对象,该对象的 current 属性可以存储任何值,并在组件的生命周期中保持不变。 ``` const ref = useRef(initialValue); ref.current = value; ``` 5. useCallback useCallback 可以让你缓存一个函数,以避免在每次渲染时都创建一个新的函数实例。它接受一个回调函数和一个依赖数组,并返回一个 memoized 的回调函数。 ``` const memoizedCallback = useCallback(() => { // 这里是回调函数的逻辑 }, [dependencies]); ``` 6. useMemo useMemo 可以让你缓存一个计算结果,以避免在每次渲染时都重新计算。它接受一个计算函数和一个依赖数组,并返回一个 memoized 的计算结果。 ``` const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); ``` 以上就是 React Hooks 的一些常用 Hook 函数,它们可以帮助你更好地处理组件状态、副作用、上下文和性能优化等问题。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汪宁宇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值