① 什么是编程如何编写一个程序
设计环境 程序也就是指令的集合,它告诉计算机如何执行特殊的任务。
编写设计环境 程序是一项系统而繁琐的工作,它不仅需要程序设计人员具有一定的功底,更需要有良好的编程习惯和风格。良好的编程习惯和风格不仅可以使程序代码更易于读懂和修改,更重要的是,它可以使程序的结构更加合理,有助于提高程序的执行效率。
对我们要使用程序设计手段去解决的问题进行系统地分析,了解程序是做什么的,要达到一种什么样的效果等。 结构设计:也就是对程序的整体框架进行设计,设计出我们需要使用的模块等等,并画出流程图。
用户界面设计:在此,我们要设计出用于与用户交互的输入输出界面。
代码设计:在这个步骤中,我们要进行代码的编写。
调试:对程序中正在发生或可能发生的各种错误进行处理。
维护:通俗地说,维护就是对程序进行升级,对原有错误进行修改。
② C#程序。功能:实现网络连接的实时监控,可是加入while循环后出现程序无法响应,“卡”的现象。
private void Form1_Load(object sender, EventArgs e)
{
var tsk = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
CheckInternet();
});
}
private void CheckInternet()
{
while (true)
{
//此处加上你的逻辑
System.Threading.Thread.Sleep(1000);
}
}
这样处理一下,不可能再卡死。
启动一个任务,用匿名委托去跑,需要.net 4.0框架才可以,这是.net 4.0以上新特性,.net多核编程入门,任务式编程。
③ 计算机编程分为哪几类
⑴BASIC语言
BASIC语言全称是Beginner’s all Purpose Symbolic Instruction Code,意为“初学者通用符号指令代码“。1964年由美国达尔摩斯学院的基米尼和科茨完成设计并提出了BASIC语言的第一个版本,经过不断丰富和发展,现已成为一种功能全面的中小型计算机语言。BASIC易学、易懂、易记、易用,是初学者的入门语言,也可以作为学习其他高级语言的基础。BASIC有解释方式和编译方式两种翻译程序。
⑵PASCAL语言
PASCAL是一种结构程序设计语言,由瑞士苏黎世联邦工业大学的沃斯(N.Wirth)教授研制,于1971年正式发表。是从ALGOL60衍生的,但功能更强且容易使用。如今,作为一个能高效率实现的实用语言和一个极好的教学工具,PASCAL语言在高校计算机软件教学中一直处于主导地位。Pascal(B.Pascal)是十七世纪法国着名数学家,他于1642年曾发明现代台式计算机的雏型机—加减法计算机。
PASCAL具有大量的控制结构,充分反映了结构化程序设计的思想和要求,直观易懂,使用灵活,既可用于科学计算,又能用来编写系统软件,应用范围日益广泛。
⑶通用编程语言C
C语言是美国AT&T(电报与电话)公司为了实现UNIX系统的设计思想而发展起来的语言工具。C语言的主要特色是兼顾了高级语言和汇编语言的特点,简洁、丰富、可移植。相当于其他高级语言子程序的函数是C语言的补充,每一个函数解决一个大问题中的小任务,函数使程序模块化。C语言提供了结构式编程所需要的各种现代化的控制结构。
C语言是一种通用编程语言,正被越来越多的计算机用户所推崇。使用C语言编写程序,既感觉到使用高级语言的自然,也体会到利用计算机硬件指令的直接,而程序员却无需卷入汇编语言的繁琐。
⑷COBOL语言
COBOL的全称是Common Business Oriented Language,意即:通用商业语言。
在企业管理中,数值计算并不复杂,但数据处理信息量却很大。为专门解决经企管理问题,于1959年,由美国的一些计算机用户组织设计了专用于商务处理的计算机语言COBOL,并于1961年美国数据系统语言协会公布。经不断修改、丰富完善和标准化,已发展为多种版本。
COBOL语言使用了300多个英语保留字,大量采用普通英语词汇和句型,COBOL程序通俗易懂,素有“英语语言”之称。
COBOL语言语法规则严格。用COBOL语言编写的任一源程序,都要依次按标识部、环境部、数据部和过程部四部分书写,COBOL程序结构的“部” 内包含“节”,“节”内包含“段”,段内包含语句,语句由字或字符串组成,整个源程序象一棵由根到干,由干到枝,由枝到叶的树,习惯上称之为树型结构。
如今COBOL语言主要应用于情报检索、商业数据处理等管理领域。
常用的高级程序设计语言,除了上述的几种之外,还有很多,如以英国着名诗人拜伦(G.N.G.Byron)的独生女艾达·拜伦(Ada Byron)的名字命名的军用语言Ada,深受中、小学生欢迎的语言LOGO等等。
④ 对于一个较为复杂的自动化任务,PLC编程的思路是什么,应该怎样考虑
根软件设计一样
根据需要硬件配置(plc点数,IO余量)
程序设计需要先要规划(数据寄存器,中间继电器分配,IO分配),程序结构框架,单元功能实现,整体程序调试,关键是形成统一的编程风格,
触摸屏程序设计同上(做到功能和结构明了,界面简洁,操作方便)
程序做大了,程序有条理对你和维护人员都方便,PLC程序超过5K,就很少人有耐性看下去了(除非带注解,功能分块实现等)
⑤ 机器人的主要编程方式有哪些
焊接机器人作为一种可编程装置,按照其编程方式可分为示
教编程、离线编程和自主编程三种。
(1)示教编程
示教编程是指操作人员通过人工手动的方式,利用示教板移动机器人末端焊枪跟踪焊缝,适时记录焊件焊缝轨迹和焊接工艺参数,机器人根据记录信息采用逐点示教的方式再现焊接过程。这种逐点记录焊枪姿态再重现的方法需要操作人员充当外部传感的角色,机器人自身缺乏外部信息传感,灵活性较差,而且对于结构复杂的焊件,需要操作人员花费大量的时间进行示教,编程效率低。当焊接环境参数发生变化时,需要重新示教焊接过程,不能适应焊接对象和任务变化的场合,焊接精度差
(2)离线编程
离线编程采用部分传感技术,主要依靠计算机图形学技术,建立机器人工作模型,对编程结果进行三维图形学动画仿真以检测编程可靠性,最后将生成的代码传递给机器人控制柜控制机器人运行。与示教编程相比,离线编程可以减少机器人工作时间,结合CAD技术,简化编程。国外机器人离线编程技术研究成熟,各工业机器人产商都配有各自机器人专用的离线编程软件系统。比如ABB的Robot studio仿真编程软件,既可以做仿真分析又可以离线编程。离线编程能够构造模拟的焊接环境,依据工况条件,应用CAD技术构造相应的夹具、零件和工具的几何模型。但缺乏真实焊接环境的传感数据,所构造的几何模型对真实焊接目标也只是部分的描述,在焊接过程中必须做出偏差调节,因此离线编程难以描述真实的三维运动,不是特别可靠,在焊接过程中必须进行实时的偏差控制以满足焊接工艺的要求
(3)自主编程
自主编程技术是实现机器人智能化的基础。自主编程技术应用各种外部传感器使得机器人能够全方位感知真实焊接环境,识别焊接工作台信息,确定工艺参数。
自主编程技术无需繁重的示教,减少了机器人的工作时间和工人的劳动时间,也无需根据工作台信息实时对焊接过程中的偏差进行纠正,大大提高了机器人的自主性和适应性而成为未来机器人发展的趋势。
目前,常用的传感器有视觉传感器、超声波传感器、电弧传感器、接触式传感器等使机器人具备视觉、听觉和触觉等。
机器人的视觉传感器主要应用电荷藕合器件(CCD一一Charged Coupled Device)摄像机模拟人眼获取外部信息,具备与工件无接触、抗电磁干扰、检测精度高、获取信息丰富等优点。超声波传感器价格低廉、测距方向性好,但是超声波易受焊接噪声、保护气流因素的干扰而衰减,影响测量精度。电弧传感器则充分利用焊接过程的电弧参数对焊缝进行测量,不需要附加其他传感器就可以计算出焊枪与工件之间的距离,广泛应用于对称坡口焊缝如V型焊缝的焊接,对于复杂焊缝无良好检测能力。接触式传感器依靠探针沿焊缝运动,检测探针的偏移得到焊枪与焊缝之间的偏差,传感器价格低廉、原理简单、方便实现。但是随着探针磨损和变形的加剧,检测精度逐步降低,对于复杂焊缝以及高速焊接场合检测能力一般。
对比而言,视觉传感器采集自然光焊缝图像、激光结构光图像和电弧光图像,激光传感器单色性好、亮度高,对焊接过程的视觉采集起到很好的辅助作用,对复杂焊缝检测能力良好。因此,具有视觉检测能力的焊接机器人更能适应环境变化,实现机器人智能化。
⑥ 为什么说 Thinkphp 不是纯面向对象的框架
面向对象是一种思想,而不只是单纯对类的实例化。
ThinkPHP属于轻量型的任务式框架,相对于函数式编程有更易于维护的过程封装,可以很好地把很多任务进行分解分类存放于Model、Controller、View以及扩展Library当中,但它还是不是属于一个有机体,只是对函数式编程的一种优化
⑦ 为什么thinkphp不是面向对象
面向对象是一种思想,而不只是单纯对类的实例化。
ThinkPHP跟Codeigniter在我看来都是属于轻量型的任务式框架,相对于函数式编
程有更易于维护的过程封装,可以很好地把很多任务进行分解分类存放于Model、Controller、View以及扩展Library当中,但它还是不
是属于一个有机体,只是对函数式编程的一种优化。
你问我滋不滋池呢,我当然滋池啦!这类框架非常适合初学者入门,同时也可以很快速地完成我们的开发任务。
⑧ 如何编写一个最简单的嵌入式操作系统简单任务调度
最简单的任务调度
以现代观点而言,一个标准个人电脑的OS应该提供以下的功能:
进程管理(Processing management)
内存管理(Memory management)
文件系统(File system)
网络通讯(Networking)
安全机制(Security)
用户界面(User interface)
驱动程序(Device drivers)
但一个最简易的嵌入式操作系统,所包含的可以少很多。最简单的操作系统,通常都是围绕着进程管理展开的。所以,现在可以尝试下一个最简单的“操作系统”,只能做简单地进行人工任务调度。为了简单起见,使用最简单的AT89S52运行程序:内存小的数的清字节数,外设只有几个IO,结构简单,很方便操作系统的编写。
1.裸跑的任务和操作系统中的任务
相信大家都很熟悉,用单片机裸跑,程序一般都写成如下一个大的while死循环:
void main (void)
{
while (1) /* repeat forever */
{
do_something();
}
}
或者又像:
void main (void)
{
while (1) /* repeat forever */
{
do_something1();
do_something2(); //Catch data input
do_something3();
.
.
.
}
}
这里每一个函数完成一个独立的操作或者任务,这些函数(也可以叫任务)以一定的顺序执行,一个接着一个。这里的任务切换,单纯就是执行完一个,再执行另一个。不断循环。
但是,一旦增加更多的任务,那么执行的顺序就变成了一个问题。在以上的例子中,一旦函数do_something1()运行了太长的时间,那么主循环就需要很长的时间才可以执行到do_something2()。如果do_something2()是接收输入数据的函数,数据就很有可能丢失。当然,我们也可以在循环中插入更多的do_something2()函数调用,或者把do_something1()拆分成几个比较小的部分。但这就比较考验编程者功力了,如果任务太多,编写程序将成为一个相当复杂的问题。
这时,一个帮助你分配各个任务运行时间的操作系统就很有必要了。在操作系统中,任务一般形如:
void check_serial_io_task (void) _task_ 1
{
/* This task checks for serial I/O */
}
void process_serial_cmds_task (void) _task_ 2
{
/* This task processes serial commands */
}
void check_kbd_io_task (void) _task_ 3
{
/* This task checks for keyboard I/O */
}
任务之间的切换已经交给操作系统完成了,熟悉的main函数和while(1)一般已经隐去不见了。
2.如何做任务切换
还是说单片机裸跑,裸跑时,把C语言文件编译成汇编,可以看到,是用CALL指令去调一个任务函数,执行完毕后,用RET退出。但是这样的方法用在切换频繁的操作系统中,就无疑不适合了,因为我们无法做到预知什么时候退出,即调用RET。
任务切换,看起来很玄,实际上说白了,就是改变程序指针PC的值。前边写的_task_ 1,_task_ 2,编译以后,都存储在ROM中。把PC指向这段ROM,他就执行了,想切换另一个任务,就用PC指向那个任务。就这么简单。这样说,是不是就是PC=一个地址就可以了?不行,因为绝大多数单片机,是不允许给PC寄存器直接赋值的。那样写,编译器会报错的。一般操作系统,都用以下方法改变PC的值:
unsigned char Task_Stack1[3];
Task_Stack1[1] = (uint16) Task_1;
Task_Stack1[2] = (uint16) Task_1 >> 8;
SP = Task_Stack1+2;
}//编译成RET
PC的值不能直接改变,但是可以变通,通过其他方式改变PC的值。一个函数执行完毕,总是要改变PC的。这是,PC是如何改变的呢?函数执行前,PC被压入了堆栈中。函数结束,要调用的是RET指令,也就是PC出栈。压在堆栈中的原始PC值,这时从堆栈中弹出,程序又回到了原来的位置。这里就是模仿这一过程:模拟一个堆栈的结构,把要执行的函数入口地址(C语言中的函数名)装入其中,把SP指向这个自己创建的堆栈栈顶。一个RET指令,就将[SP]和[SP-1]弹到PC中了。就这样,PC改变到了要执行的函数入口地址,开始执行目标函数。(AT89s52的PC为16位,压到堆栈中是两个字节)
3.一个最简单的人工调度系统
应用上面的思想,写一个最简单的3任务人工调度系统。代码如下:
typedef unsigned char uint8;
typedef unsigned int uint16;
#include
sbit led0 = P0^0;
sbit led1 = P0^1;
sbit led2 = P0^2;
uint8 Cur_TaskID; //当前运行的任务号
uint8 Task_Stack0[10]; //0号任务的堆栈
uint8 Task_Stack1[10];
uint8 Task_Stack2[10];
uint8 Task_StackSP[3]; //3个堆栈的栈顶指针
//Task_StackSP[0] -> Task_Stack0
//Task_StackSP[1] -> Task_Stack1
//Task_StackSP[2] -> Task_Stack2
void Task_0(); //任务0
void Task_1(); //任务1
void Task_2(); //任务2
void Task_Scheling(uint8 Task_ID); //任务调度
void main (void)
{
Task_Stack0[1] = (uint16) Task_0; //按照小端模式,任务函数入口地址装入任务堆栈
Task_Stack0[2] = (uint16) Task_0 >> 8;
Task_Stack1[1] = (uint16) Task_1;
Task_Stack1[2] = (uint16) Task_1 >> 8;
Task_Stack2[1] = (uint16) Task_2;
Task_Stack2[2] = (uint16) Task_2 >> 8;
Task_StackSP[0] = Task_Stack0;
Task_StackSP[0] += 2; //刚入栈两个元素。这里取得栈顶地址,即Task_Stack0[2]
Task_StackSP[1] = Task_Stack1;
Task_StackSP[1] += 2;
Task_StackSP[2] = Task_Stack2;
Task_StackSP[2] += 2;
Cur_TaskID = 0;
SP = Task_StackSP[0]; //SP取得0号任务的栈顶地址
}//利用main的返回指令RET,使PC取得0号任务入口地址
//任务调度函数
void Task_Scheling(uint8 Task_ID)
{
Task_StackSP[Cur_TaskID] = SP;
Cur_TaskID = Task_ID;
SP = Task_StackSP[Cur_TaskID];
}
//0号任务函数
void Task_0()
{
while(1)
{
led0 = 0;
Task_Scheling(1);
}
}
//1号任务函数
void Task_1()
{
while(1)
{
led1 = 0;
Task_Scheling(2);
}
}
//2号任务函数
void Task_2()
{
while(1)
{
led2 = 0;
Task_Scheling(0);
}
}
代码要做的,就是3个任务的顺序执行。任务调度函数Task_Scheling的思想也即如前面所述。在Keil中可以运行代码,可以看到,程序在3个任务中顺序执行了。
⑨ 面向任务开发
面向任务开发(Task-Oriented Development)是继面向对象和基于构件开发后,又一软件开发新范型。由道仑软件公司的熊军民于2007年首次提出,并成功在该公司的道仑数字神经系统平台ROAD上实现。
面向任务开发主要用于业务领域的应用开发。
面向任务开发的核心理念是以业务为中心,将所有的业务活动用普通用户能理解的方式包装成任务。任务是一个自包含的对象,任务既包含业务逻辑,同时又是业务逻辑的组成单元,也是可单独执行和管理的业务单元。企业以任务为中心组织完成任务所需的各种资源。
相对于基于构件开发(CBD),面向任务开发(TOD)具有如下优势:
1.任务直接反映和表达业务需求,一般用户都可以理解和操作,不需要技术人员的参与,这就消除了业务需求与软件实现之间的鸿沟,能更快更好地满足用户的需求。
2.任务比目前业界流行的“基于构件开发”中的构件更“软”和更“轻”。构件是物理上存在的程序代码,需要软件开发人员编程实现,而任务是用户就可以定义的对象,因此更容易改变,改变花费的代价更小,更能适应业务的变化。
3.由于任务封装了业务活动的所有细节,大大简化了业务建模的复杂度。
4.业务层面的可重用性强。定义好的任务可以很容易地放到别的任务中,就象搭积木一样。
5.由于任务可调用或引用Web服务,用户可以透明地访问网络上的Web服务,不管它们位于何处,任务将网络上的资源无缝地集成起来了。
6.由于各种业务都是基于相同的单元(任务)构建并在同一种平台上运行,它们之间的“集成”将不会有任何障碍,业务流程的集成问题将成为历史。
7.用户使用TOD开发业务应用比使用CBD开发所需的成本和费用要小得多。
8.由于用户可自行建立、改变和管理业务流程,信息系统的建设完全由用户所掌控。
面向任务开发将把信息系统的建设带入一个用户主导的时代。