ssyniuej 发表于 2009-7-23 15:41:28

我也来上盘菜,呵呵。WINDOWS版的PMW_C,核心还是版主的,我加个界面。暂时只实现选择源文

直接上菜,大家试吧。
点击此处下载 ourdev_463759.rar(文件大小:93K) (原文件名:PWM_C.rar)
解开应该就可以用了。试一下吧。我采用的是静态链接库,应该有没装MFC的机器上也可以正常使用。

ssyniuej 发表于 2009-7-23 17:53:51

再完善一下。第一、二、三功能均可实现,并且第二个功能只需要执行一次就可以了。以后就不必了(因为第一次不同机器可能安装的编译器位置不同),并且程序实现了如果没有选择好编译器位置,自动跳过编译,会产生提示的。
    版主,那个下载有没有命令行方式?想偷个懒,呵呵。
点击此处下载 ourdev_463816.rar(文件大小:96K) (原文件名:PWM_C.rar)
上面是刚更新完成的,也就是说原来版本的功能已经实现了,只是原来打算的自动下载还没有开始。大家检测一下转换是否正常。反正我测试了一下还没有问题。不过如果出现了不支持的元件,转换是可以成功的,但后面的编译就会出现问题。最终会生成一个与源文件名相同的HEX文件。
    版主有没有什么可以偷懒的方法来实现一下自动下载?呵呵。

winmcu 发表于 2009-7-23 17:59:11

已下载试用,比起原来的DOS这个要好用点。期待完善功能。

xiaozhiyong 发表于 2009-7-23 18:58:35

版主可以看看我做的这个,原理是用您的程序做成一个可以被调用的程序,就是用:int main(int argc, char *argv[])这个语句开头,这样,就可以用DOS去带参数地调用这个转换程序,而这个参数就是文件名。将这个文件名输入in_file这个变量就和在DOS里用是一样的了,于是我就写了一个相当于一个外壳程序主要用来调动这个转换程序,原理还是system语句。外壳程序主要处理的是一些路径的转换。

点击此处下载 ourdev_463900.rar(文件大小:3.43M) (原文件名:pmw_hex.rar)
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_463906.jpg
(原文件名:18 点 52 分 55 秒.jpg)

xiaozhiyong 发表于 2009-7-23 19:18:32

没有,我只收到一台申通快递的。

xiaozhiyong 发表于 2009-7-23 19:20:35

请问版主,为什么会用您改进的程序会出现这样的错误,另楼主ssyniuej的原代码好像没共享,我想参考一下。
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_463905.jpg
(原文件名:19 点 14 分 05 秒.jpg)

xiaozhiyong 发表于 2009-7-23 21:12:07

点击此处下载 ourdev_463925.rar(文件大小:310K) (原文件名:pmwHex1.rar)

ssyniuej 发表于 2009-7-23 22:58:11

可以,现在上传,只是没有第四个下载功能,其余功能已经完成。
源程序ourdev_463986.rar(文件大小:29K) (原文件名:PWM_C.rar)
完全重写的外壳,对于版主的核心代码有部分进行了修改。主要是我采用的一次性读取所有数据,然后利用缓冲来操作的。对于文件选择也采用了对话框。

ssyniuej 发表于 2009-7-23 23:04:57

对了,不知道版主这个核心所用的协议从那里下载,不好意思啊,我不知道搜索什么关键字,如果有协议的话,以后可能还可以自己再稍微修改一下。

xiaozhiyong 发表于 2009-7-24 08:54:29

楼主可以研究一下这个,使它可以生成和三菱兼容的文件。
    点击此处下载 ourdev_464057.rar(文件大小:5.52M) (原文件名:PLC上位机编程软件.rar)
    这样就可以用自己的软件来写PMW了,等下载程序研究出来也可以加的这个软件上,那样就实现“四合一”(编程软件、转换软件、编译软件、下载软件)了。

ssyniuej 发表于 2009-7-24 15:50:51

后面已经准备用串行通讯控件来做下载的了。这个可能就稍微要些时间了,因为要与芯片联系,以前没用过这个芯片。这是第一次使用。

xiaozhiyong 发表于 2009-7-24 16:40:45

我试过串行通讯控件,但没有握手成功,希望你能搞出来

zhangfuhg 发表于 2009-7-24 21:56:51

谢谢分享!

ssyniuej 发表于 2009-7-25 18:53:42

请版主帮忙解答一个问题。
现在在测试下载,写入基本正常。但是在最后的校验过程有点问题。
能不能请版主以一页数据详细说一下这个双字节校验和是怎么计算的?我把128字节单独加起来保留两个字节不对,把128字节变成64个字再相加,也保留两个字节也不对,另外变成字的时候我也试过高低字节切换,不知道还有什么方法来计算?现在在最后的校验上出现了问题。不知道是写错了呢,还是校验出错?写的时候有应答。一直到全部写完应答均正常。就是接收校验值的时候开始对不上了。

ssyniuej 发表于 2009-7-25 19:43:46

完整功能测试版,再上菜点击此处下载 ourdev_464508.rar(文件大小:29K) (原文件名:PWM_C.rar)
今天没精神了,就这样吧,先上来,大家试一下吧。以后改成一键工作的。

ssyniuej 发表于 2009-7-25 19:44:52

版主方便透露一下这个协议怎么分析吗?就是监听到了数据,有什么心得来自己得到协议?

xiaozhiyong 发表于 2009-7-25 20:39:05

显示如下错误,不知为何:
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_464526.jpg
(原文件名:20 点 37 分 25 秒.jpg)
   点忽略之后出现:
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_464527.jpg
(原文件名:20 点 43 分 02 秒.jpg)

ssyniuej 发表于 2009-7-26 11:07:05

首先感谢版主,协议是太有用了,呵呵。只是我自己想了一下我可能就分析出来,虽然我也能够监听到这个串行数据。但有些地方我估计我分析不出来,例如怎么知道那个字节是页定义,后面的校验算法是什么样的,还有对于各个波特率返回的常数(这个我是通过一个自己编写的软件测出来,但我估计版主不是这样做的),所以要向版主学习的东西还是太多了!
   回楼上,这个提示可能是你的文件名太长了!(包括路径)可能已经超出了我内部缓冲的大小了,所以造成文件名错了。

ssyniuej 发表于 2009-7-26 11:12:41

另外这里面有个文件 "PLC_S1.H"是要放在与这个软件在同一个目录下的。因为打开的时候默认是在此目录下的。后面我加上些判断吧,呵呵。原来省了。

ssyniuej 发表于 2009-7-26 11:42:50

点击此处下载 ourdev_464635.rar(文件大小:99K) (原文件名:PWM_C.rar)
再上传修改过的文件,这里面会对于文件操作出现的问题进行检测。同时简化操作。变成两步。

ssyniuej 发表于 2009-7-26 13:16:44

请教不敢,其实我也属于那种水货师傅级,呵呵。以前我也曾经说过,我上位机编程很差的。
对于C里面,你可以用函数指针来调用。如果对于多个函数,可以定义个函数指针的数组。然后就把这个数组设置成你所要定义的函数名就行了。
    下面写的不一定正确,呵呵。如果有高手请高手帮个忙。
    如果想调 用的第一个函数是void myfun1(void);
    void (*func)();
    func = myfun1;
    当需要执行函数的时候,运行(*func)();就可以了。这里是用了数组,如果只有一个函数就把数组部分去掉。
    我以前用过是把几个函数通过这种方法通过指针方法设置一个数组。然后根据传入的命令直接调用相应的函数,比较方便。
    版主,再问一下啊。我想把你的那个"PLC_S1.H"直接做到程序里面,就是不再去打开外部文件。这样会不会更好呢?不过这样就不方便修改了。就是文件的头就不大容易修改。

ssyniuej 发表于 2009-7-26 15:55:43

还是这种方法,是没看仔细。如果是这样的话,你只需要将这个变量的值送给定义的函数指针就行了,然后直接调用用就跳过去。
    在这种方式下其实工作不是很安全的。因为C语言一般是按结构化设计。这样跳出去不再回来可能会造成致命错误!因为可能会造成一些堆栈无法释放。
    另外对于不同的CPU内部处理方式有区别的,象51一般会变成CALL命令,所以可能就不适合了。对于ARM一般会变成BL指令,这样不返回没问题。
    如果要实现这种要求,可能直接用汇编来写会好些。避免不同编译器出不同的代码。但是感觉就比较容易出问题了。
    汇编写程序是比较简单,但是如果程序一大维护就非常麻烦了,其实C语言优化后的代码一点也不比汇编差。
    那个"PLC_S1.H"文件里面没有与移植相关的语句吧?只是相当于一些说明和一行文件包含加上一个函数的头。应该不会影响到移植吧?真正的移植相关的应该是内部的那个包含文件。

xiaozhiyong 发表于 2009-7-26 17:30:14

请问楼主,程序里system(c51.exe ...)的返回值是2,是什么错误?

xiaozhiyong 发表于 2009-7-26 17:50:48

我发现用楼主的程序进行pmw转c时和用以前版主的程序进行pmw转c得到的结果不一样。
用版主的程序得到的结果:
void main_PLC(void)
{
                _LD        (_M8000_)
                _OUT_T        (_T1,10)
                _LD        (_T1_)
                _OUT         (_Y0_)
                _LD        (_Y0_)
                _OUT_T        (_T2,10)
                _LD        (_T2_)
                _OUT         (_Y1_)
                _LD        (_Y1_)
                _OUT_T        (_T3,10)
                _LD        (_T3_)
                _OUT         (_Y2_)
                _LD        (_Y2_)
                _OUT_T        (_T4,10)
                _LD        (_T4_)
                _OUT         (_Y3_)
                _LD        (_Y3_)
                _OUT_T        (_T5,10)
                _LD        (_T5_)
                _OUT         (_Y4_)
                _LD        (_Y4_)
                _OUT_T        (_T6,10)
                _LD        (_T6_)
                _OUT         (_Y5_)
                _LD        (_Y5_)
                _OUT_T        (_T7,10)
                _LD        (_T7_)
                _OUT         (_Y6_)
                _LD        (_Y6_)
                _OUT_T        (_T8,10)
                _LD        (_T8_)
                _OUT         (_Y7_)
                _LD        (_Y7_)
                _OUT_T        (_T0,10)
                _LD        (_T0_)
                _RST_T        (_T1)
                _RST_T        (_T2)
                _RST_T        (_T3)
                _RST_T        (_T4)
                _RST_T        (_T5)
                _RST_T        (_T6)
                _RST_T        (_T7)
                _RST_T        (_T8)
                _RST_T        (_T9)
                _RST_T        (_T0)
                _END
}
用楼主程序得到的结果:
void main_PLC(void)
{
                _LD        (_M8000_)
                _OUT_        (_T1,10)
                _LD        (_T1_)
                _OUT        (_Y0_)
                _LD        (_Y0_)
                _OUT_        (_T2,10)
                _LD        (_T2_)
                _OUT        (_Y1_)
                _LD        (_Y1_)
                _OUT_        (_T3,10)
                _LD        (_T3_)
                _OUT        (_Y2_)
                _LD        (_Y2_)
                _OUT_        (_T4,10)
                _LD        (_T4_)
                _OUT        (_Y3_)
                _LD        (_Y3_)
                _OUT_        (_T5,10)
                _LD        (_T5_)
                _OUT        (_Y4_)
                _LD        (_Y4_)
                _OUT_        (_T6,10)
                _LD        (_T6_)
                _OUT        (_Y5_)
                _LD        (_Y5_)
                _OUT_        (_T7,10)
                _LD        (_T7_)
                _OUT        (_Y6_)
                _LD        (_Y6_)
                _OUT_        (_T8,10)
                _LD        (_T8_)
                _OUT        (_Y7_)
                _LD        (_Y7_)
                _OUT_        (_T0,10)
                _LD        (_T0_)
                _RST        (_T1)
                _RST        (_T2)
                _RST        (_T3)
                _RST        (_T4)
                _RST        (_T5)
                _RST        (_T6)
                _RST        (_T7)
                _RST        (_T8)
                _RST        (_T9)
                _RST        (_T0)
                _END
}
上面的这个程序编译不通过,有45 errors.

xiaozhiyong 发表于 2009-7-26 18:16:52

找到了,下面的程序里有两句:
                                        str = "\t\t_OUT_\t(_T";
                                        sprintf(buf,"%d,",fip & 0xff);
                                        str += buf;
                                        outc.Write(str,str.GetLength());
                                        La = 2*i;
                                        fnc_ex(1,0);
                                        i = La/2;
                                }
                                else if ((fip >> 8) == 0x0e)
                                {
                                        str = "\t\t_OUT_\t(_C";
str = "\t\t_OUT_\t(_T";
str = "\t\t_OUT_\t(_C";
应为:
str = "\t\t_OUT_T\t(_T";
str = "\t\t_OUT_C\t(_C";
不知楼主的程序里是否有这个问题。

xiaozhiyong 发表于 2009-7-26 18:38:53

楼主27楼和21楼的程序序好像也有这个问题。而且21楼的程序好像并非“完整功能测试版”,我没有看到下整按钮的程序。

beer 发表于 2009-7-26 18:48:36

做个记号。。   用得着。。

ssyniuej 发表于 2009-7-27 10:10:29

版主太客气了,因为我也是不大明白,呵呵。现在知道了。我没有考虑那么远。我原来是想用外部文件有的时候有人可能会忘掉把文件拷贝过来造成程序没法运行。现在我27楼程序会对这种问题进行提示的。
    对于编译器的返回值,一般0为成功,1为报警,2为错误。在编译的时候出现1比较正常,因为这里面有好多函数没有用到,所以编译出来后会出现大量报警。所以我程序里面允许报警。但如果出现错误,那肯定是编译有问题了,后面再进行就没有意义了,所以会报错退出。
    谢谢xiaozhiyong,我的程序中是有这个错误,现在改正过来。把可执行文件和源文件一起上传。
    现在版本中只要两步操作。就是转换编译部分算一步了。因为下载的时候要通过硬件上电配合,所以把下载单独做一步。另外增加了个Keil路径显示。如果没有选择好这个部分,则转换的时候不会进行编译。由于这个功能不是每次都必须的,所以就不再做为必须使用的步骤了。
    请大家继续测试,谢谢。找到的问题请传到这里。然后我来修改一下。另外希望有高手指点一下编程,呵呵。本人水平太差。
    另外原来的下载程序用的是API函数,而我用了控件,所以执行方式不完全相同。但结果应该是一样。按照我原来 的想法,我的这个下载应该比原来的下载占用时间少很多,不知道是不是这样,呵呵。只是自己想的。
    对于串口编程,可能控件并不是很好用的。只是稍微简单些。以后可能就用API函数来操作会更加方便些。
    另外说明一下简单流程。这个程序只能实现转换和下载功能,其实编译根本就不是这个程序所实现的。编译是通过调用了外部的编译器来实现的。编译的时候不仅依赖于这个转换出来的文件,还会依赖于功能的外部实现文件。所以有可能会出现转换正常,但编译失败的情况,简单例子是使用的单元超出范围了,例如输入只能达到17,而PLC里面使用了输入20,那么就会转换正常,但编译失败(只是举例)请大家使用的时候注意一下。
可执行文件ourdev_464839.rar(文件大小:99K) (原文件名:PWM_C.rar)
源文件ourdev_464840.rar(文件大小:21K) (原文件名:PWM_C.rar)

xiaozhiyong 发表于 2009-7-27 11:55:04

不知楼主有没有看15楼的程序,可否让其生成pmw文件,和三菱的文件兼容。

ssyniuej 发表于 2009-7-27 13:42:44

执行了一下,那是个框架,还没有写具体翻译。不过我的上位机水平很差。翻译其实我相信我可以做出来,但是界面就做不出来了。梯形图要求对于数据要能够正常显示出来的。还是用原来的三菱的软件更好些。
    上位软件还要做检测的,这个可能就麻烦些了。
    如果真的要做的话,那么就不必要再做三菱的软件了,直接就转换出来了。没有必要再多这么多步。

xiaozhiyong 发表于 2009-7-27 16:41:59

改进了一下,实现一键转换下载,同时楼主的程序,在设定完编绎器之后就不能正常转换,我通过重新设定路径改进了这一点。
    下载时只要跟据提示重启设备即可。
点击此处下载 ourdev_464984.rar(文件大小:3.42M) (原文件名:改进测试版.rar)

ssyniuej 发表于 2009-7-27 20:06:53

不是吧?!设定完编译器之后不能正常转换?那里面没有设定编译器,只是从里面取了个路径。至于那三个软件必须是系统安装的时候的文件名。我是利用获取的路径然后加上三个软件的名称。因为不同的人的计算机编译软件安装的位置不同,所以在下面有个设置按钮。在没有设置的情况下,是不会自动进行编译的。操作中有相应的提示。

ssyniuej 发表于 2009-7-27 20:07:52

看样子没有其他人来测试了。这软件就这样吧。也没有时间了。要做手头的事了。

ssyniuej 发表于 2009-7-27 20:12:23

看了一下,界面改了一些。感觉好些。主要功能没变。最好还是用对话框提示一下。这样可以给人反应时间。我最后版本中所有功能全有了。并且出现问题也都是用对话框来提示的。原来下载过程中我也是采用这种方式,没有提示。现在虽然在编辑框里面加了一行字,但还是容易出现问题。我最后版本增加了对话框,可以给操作人员相应的提示,并且可以让操作人员来选择什么时候开始。
   如果愿意的话,可以加上一个编辑框,对于每一步操作进行一下记录。另外可以加上进度提示。这样就比较完整些了。

xiaozhiyong 发表于 2009-7-27 22:19:35

WAND指令翻译不正确。

xiaozhiyong 发表于 2009-7-27 22:32:36

找到了,是如下的:str.Format("%#06%X",l);中多了一个%,应为:str.Format("%#06X",l);



                        if(b != 0)
                        {
                                str.Format("%#010%X",l);
                        }
                        else
                        {
                                str.Format("%#06%X",l);
                        }

xiaozhiyong 发表于 2009-7-27 22:35:18

我改过之后可以全部转换通过了。
点击此处下载 ourdev_465058.rar(文件大小:3.43M) (原文件名:改进测试版.rar)

ssyniuej 发表于 2009-7-27 23:18:28

点击此处下载 ourdev_465066.rar(文件大小:99K) (原文件名:PWM_C.rar)
已经完成修改。

xiaozhiyong 发表于 2009-7-27 23:45:43

再改,以Shellexecute语句代替system调用,这样可以让编译调用隐藏执行:

点击此处下载 ourdev_465074.rar(文件大小:3.43M) (原文件名:改进测试版.rar)

ssyniuej 发表于 2009-7-28 10:34:20

我也学习一下上位编程,呵呵。希望有更多的人来测试一下。我认为不怕程序里面有BUG,就怕找不到,如果有更多的人来测试就能够找到并且处理掉。
    谢谢xiaozhiyong,多学了个函数,呵呵。不过这个函数无法得到调用的外部软件的返回值,所以无法得到错误状态。也就是说如果编译出现错误也会提示转换完成。因为返回值没有得到。请问这个问题能够解决不?虽然可以隐藏执行了,但关键的返回值没了。
    另外这种隐藏窗口的函数是不是可以用来做点坏事?呵呵。

xiaozhiyong 发表于 2009-7-28 17:43:51

隐藏窗口执行时,返回结果是一定可以得到的,Keil里面就是这样的。我也不是很清楚,我是第一次用这个函数(在网上搜到的。),另外,编译的结果是在一个lis文件里的,而链接的结果不知在哪里,但一定是可以找到的,因为Keil里估计就是这样运行然后将结果显的。

    跟据网上的,我写的调用是有等待完成的语句的,这种调用只有完成了才执行下面的语句,因为如果编译没有完成,链接是会出错的,我正是遇到了这种问题,才上网找到了这样的语句。

ssyniuej 发表于 2009-7-28 18:40:43

这看了一下这个函数,没发现有获取返回值的参数,并且我专门将文件改成有问题的,让编译通不过,这个函数没有反应,也能正常直接返回。当然对于每一步再去检测生成的结果也是可以的,但我是想尽量能够直接利用编译器的返回会更加可靠一些,并且会更加简单。这个函数象是启动功能很全。启动后会返回一个句柄,后面的函数在等待句柄(可能是等待句柄变化吧)。硬着头皮看的几个函数的说明。不过英文太烂,还是没看清楚。呵呵。希望有人能够帮忙解答一下。

yrj1234 发表于 2010-1-22 15:43:59

PLC_S1.H 文件在哪里?

duzhh 发表于 2012-10-16 16:16:37

PMW_C.EXE都不能用 ."找不到PLC_S1.H"

duzhh 发表于 2012-10-16 16:25:24

c:\1.bmp

liupeng9181 发表于 2014-2-12 19:36:59

强悍的人{:smile:}
页: [1]
查看完整版本: 我也来上盘菜,呵呵。WINDOWS版的PMW_C,核心还是版主的,我加个界面。暂时只实现选择源文