2008年11月06日

记得很久以前用过,可今天用起来还是有的不太顺.索性做成一个类,方便以后使用.

 .h文件

class CIniFile 
{
public:
 CIniFile();
 virtual ~CIniFile();
 // //获得section值
 int  GetSectionValue(CString &strName);
 CString GetSectionValueS(CString &strName);
 BOOL SetSectionValue(LPCTSTR strValue,CString &strName);
private:
 CString sFilePath;
 CString strSection;
 CString strIniFileName ;
};

.cpp文件

CIniFile::CIniFile()
{
 int nPos;
 strSection       = "SET DEFAULT VALUE";
   
 GetModuleFileName(NULL,sFilePath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
 sFilePath.ReleaseBuffer ();

 nPos=sFilePath.ReverseFind(‘\\’);
 sFilePath=sFilePath.Left (nPos);
 strIniFileName = sFilePath + "\\config.ini";
}

CIniFile::~CIniFile()
{

}
int CIniFile::GetSectionValue(CString &strName)
{
 int nCount= GetPrivateProfileInt(strSection.GetBuffer(0),strName.GetBuffer(0),0,strIniFileName);
 return nCount;
}
BOOL CIniFile::SetSectionValue(LPCTSTR strValue,CString &strName)
{
 BOOL bRect =  WritePrivateProfileString(strSection.GetBuffer(0),strName.GetBuffer(0),strValue,
  strIniFileName);
 return bRect;
}
CString CIniFile::GetSectionValueS(CString &strName)
{
 CString strSect;
 GetPrivateProfileString(strSection.GetBuffer(0),strName.GetBuffer(0),"默认",strSect.GetBuffer(MAX_PATH),MAX_PATH,strIniFileName);
 return strSect;
}

测试代码

 CIniFile file;
  CString str="Name";
  CString str2= "AGE";
  file.SetSectionValue("Li",str);
  
  file.SetSectionValue("19",str2);

  CString str3 = file.GetSectionValueS(str);
  int i   = file.GetSectionValue(str2);
  
 

2008年08月28日

Introduction

Although this issue was raised many-many times, I found no good and concise explanation of the basic techniques one has to use to communicate between a user mode application and a kernel mode driver. Most of the first tries are about sharing events, and use the SetEvent and the WaitForSingleObject functions to implement notification. While it may serve the purpose in certain cases, this technique is slow and not a good way of doing it.

In this article, I’ll describe the way my applications and drivers communicate. This is not the only technique you can use, but I found it convenient and considerably easy to implement.

Sample Projects

Please note that the sample application isn’t complete, because I cannot simulate a hardware IRQ. Nevertheless, it has all the code you need to understand what’s going on. The user mode application is also un-tested, and uses IOCP ports which makes it a bit more complex.

Assumptions

Here are the assumptions I make about the problem:

  1. You have a hardware that generates interrupts.
  2. When an IRQ fires, you want to read some data from the hardware.
  3. You want to pass this data back to an application.

Note that this general description fits to many problems, such as reading a file from the hard-drive, or collecting data from a custom data acquisition hardware.

Implementation of the user mode application

As I said earlier, my assumption is that the user mode application is waiting for the driver to generate some data. Most probably, you’ll want to have a thread that has a loop in it, which will read the data from the driver and do something with it. So, the first step obviously is to open the driver.

1. Open the device

I won’t go into too much details here. You have to use the CreateFile function to open the device. Pass in the OPEN_EXISTING flag for the dwCreationDisposition, and the FILE_FLAG_OVERLAPPED for the dwFlagsAndAttributes. The latter one is not necessary, but since your driver is most probably 100% asynchron-ready (is it?), you’ll communicate asynchronously with it, anyway. One more note on opening the device: you must call the IoCreateSymbolicLink function in your driver when you create the device object in order to be able to open the device with the CreateFile function.

2. Read that data!

Once you have the device open, you can use the ReadFile function to read data from the device driver. Since we opened the device with the overlapped flag, you have to use an OVERLAPPED structure here. When you call ReadFile, it will immediately return with 0, and GetLastError will return ERROR_IO_PENDING. Now, call one of the wait functions (i.e., WaitForSingleObject, GetQueuedCompletionStatus, etc.) to wait for the data to arrive.

When the wait function returns (with success), the buffer you passed in to ReadFile contains the data you were so keen on getting!

Implementation of the kernel mode driver

Since we want to read data from the driver, you’ll need a dispatch read function. You can specify it in your DriverEntry routine by setting the DriverObject->MajorFunction[IRP_MJ_READ] field. This function has the following signature:

NTSTATUS DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

The next step is to set up some sort of queue that will store the read requests. For this, I use the LIST_ENTRY structure and initialize it with the InitializeListHead function. You can do it in the DriverEntry routine. Don’t forget that this list must be in non-pageable memory! The best thing is to put it in your device extension structure. As you probably know, queues are a real pain when you store IRPs in it and want to be sure that the cancellation of these IRPs are correctly done. God bless Microsoft, for it provided (in newer DDKs) the CSQ routines! They will do most of the hard work. (See DDK for a complete sample.)

So, the next step is to initialize our queue ‘cancel-safely’. This is done by calling the IoCsqInitialize function.

After this, we implement the dispatch read function so that it puts the incoming IRP into our queue (just for clarity: 1 ReadFile in user mode = 1 IRP in the dispatch read function). This is done by calling the IoCsqInsertIrp function. Now that we have the IRP queued, we simply return STATUS_PENDING, telling the IO system that the operation is registered and will be served. Note that when we return from the dispatch routine, the ReadFile function in the user mode code will return also, and – as expected – GetLastError returns ERROR_STATUS_PENDING.

Now, when an IRQ arrives, we have to read the data from the device. Do it like this:

  1. Disable the IRQ in the hardware, so we can safely access the hardware memory or ports.
  2. Queue the DPC routine by calling KeInsertQueueDpc. It is of utmost importance that you don’t do anything in your IRQ routine except for these two steps! (Of course, you can do whatever you want, but then your Windows will be deadly slow.)
  3. In your DPC routine, call the IoCsqRemoveNextIrp function to de-queue an IRP that the dispatch read function queued. If it returns NULL, the queue is empty.
  4. Get access to the user buffer by doing something like this (Irp is the IRP we’ve just de-queued):
    PUCHAR UserBuffer = (PUCHAR)MmGetSystemAddressForMdl(Irp->MdlAddress);
  5. Read data from your hardware and fill the UserBuffer.
  6. Make sure that the buffers are all flushed:
    KeFlushIoBuffers(Irp->MdlAddress, TRUE, FALSE);
  7. Call the IoCompleteRequest and pass in Irp to complete it.
  8. Re-enable the IRQ in the hardware.

When step 7 completes, the wait function in your user mode application returns and the buffer is full of data!

Conclusions

As you can see, it’s not so difficult to implement data exchange once you know the techniques. In a real application, there are additional steps you have to make, such as checking the user buffer’s size and accessibility. Also, it is usually unnecessary to complete an IRP each time you have an IRQ. You could as well just fill the buffer until it’s full, and complete it when there is no space left in the buffer. The size of the buffer is in the current stack location of the IRP:

PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

ULONG BufferSize = IrpStack->Parameters.Read.Length;
2008年06月20日

class   CCryptRandom
{  
public:  
 CCryptRandom();  
 virtual   ~CCryptRandom();  
 BOOL   get(void   *lpGoop,   DWORD   cbGoop);  
private:  
 HCRYPTPROV   m_hProv;  
};  

CCryptRandom::CCryptRandom()  
{  
 m_hProv   =   NULL;  
 CryptAcquireContext(&m_hProv,  
  NULL,   NULL,  
  PROV_RSA_FULL,   CRYPT_VERIFYCONTEXT);  
}  

CCryptRandom::~CCryptRandom()   {  
 if   (m_hProv)   CryptReleaseContext(m_hProv,   0);  
}  

BOOL   CCryptRandom::get(void   *lpGoop,   DWORD   cbGoop)  
{  
 if   (!m_hProv) 
  return   FALSE;  
 return   CryptGenRandom(m_hProv,   cbGoop,  reinterpret_cast<LPBYTE>(lpGoop));  
}  

引用需要用到头文件#include <Wincrypt.h.>
  CCryptRandom   r;    
  for   (int   i=0;   i<10;   i++) 
  {  
   DWORD   d;  
   if   (r.get(&d,   sizeof d))  
    cout   << d /1000<<   endl;  
  }  

 

 

 

根据时间产生随机数

 CString str,temp;
  int   i;  

  srand( (unsigned)time(  NULL )  );  

  /*   Display   10   numbers.   */  
  for(   i   =   0;       i   <   10;i++   )  
   printf(   "     %6d\n",   rand()   );  

bool WriteLog(CString filename,CString str) { CStdioFile file; if (file.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::typeText)==0) return false; file.SeekToEnd(); CTime time=CTime::GetCurrentTime(); str="[%m/%d %H:%M:%S ]"+str; str.Format("%s\n",time.Format(str)); file.WriteString(str); file.Close(); return true; }

2008年06月08日

硕士博士期间的收获

 

1)  科研的本质不是按照现有的理论来推测试验结果,而是相反;
2
)体会到科研理论的作用是:除了使我们对现在的研究现状有个比较清晰的了解外,主要是告诉我们他本身现在的缺陷和作为靶子让我们推翻它并建立最终会被后人推翻的现在的理论;即理论的作用主要是让我们来推翻它,而不是补充它,理论在很多时候是我们思维的桎梏,因为我们的行为首先受他制约;
3
)科研不是简单的学习和熟练不熟悉的技术,而是提出问题可怎样解决问题的过程,与技术熟练程度没有本质联系;
4
)知道了科研对研究人员的情感要求高于智力要求,意志和决心常常大于智力的作用,因为它首先决定了研究人员是否决定和持续应用他的智力资源;
5
)科研选题最为重要。
6
)“科学最需要的是自己的思路,西方莫不如此。

 

科学最最需要的是坚持自己的思路,错了只是自己的失误,正确了,是人类的福址,西方莫不如此。

 

随大流不是科学,相反是迷信,是人类最大的迷信。国内很多人在搞所谓的科学,但是我想他们实际上在进行大规模的迷信活动,一种“科学”名义上的迷信活动。

 

我说这样观点的理由是:科学的进步除了验证外,更深层次的是证伪,也就是寻求不一致及其原因,只有知道了什么方面能够证实,什么方面能够证伪,我们才对事物有了科学的认识。也就是说:知道事物的两面才可能真正的认识事物。但是我们很多人已经忘记了硬币的另一面。

 

只有具有了自己的思路,并坚持,不顾外界的各种压力,才可能促进科学的真正进步。没有哥白尼的坚持,科学时代的到来可能更晚一些,没有达尔文自己一生的坚持,不会有《进化论》的诞生,没有爱因斯坦的孤独寂寞,物理学的革命要进一步推迟,没有Duesberg的坚持,癌症领域的研究将会更长时间忘记非整倍体的作用,没有Prehn的坚持,免疫对癌症的刺激研究会消失。

 

西方人有坚持自己观点的习惯,甚至达到固执的程度。可能因为:他们自己认为自己坚持的就是真理,所以需要以自己的生命和名誉来维护和坚持。即使以后被证明错了,也只是自己的错误,正确了,是人类的幸运。况且,真理总是由两部分构成,一部分是“正确”的例子,一部分是“失误”的例子,只知道正确的例子不会真的认识真理,只有正反都知道了,才可能真的把握真理。从这个层次上说,坚持“错误”的观点也不能被认为就是历史的罪人,相反还有积极的,甚至真正的积极作用。人类进步的唯一道路是试错,不断的试错不断的进步,从这个意义上说,个人的观点已经没有什么谁对谁错,都是真理进步的阶梯。

 

从个人认知角度来看,自己掌握的事实和推理技能是坚持自己观点的基础,也只有自己真正清楚自己的观点的正确程度,因此坚持自己的观点是坚持真理的最好策略和法则,西方人运用了并获得成功。相反,我们无法真的理解别人的观点,更难以达到别人的理解层次,从这个意义上说相信别人不相信自己就是迷信,这也其实是迷信存在的根源。因此,从某种意义上说,坚持自己的观点而不是总相信别人的观点是破除迷信的最有效手段,同样也是科学能够不断进步的最基本要求。

 

综上所述,我们有坚实的理由具有自己的思路,更有坚实的理由保卫自己的观点,那样才可能为自己和社会注入生命力。”

 

对科学和人生的感悟
感悟1
在作博士课题的两年里,随着对肿瘤研究的深入理解,感觉到许多大科学家的文章背后都依靠着某个先哲的哲学思想,但是不知道他们在有新的发现之前是不是也是运用某种哲学思想在考虑问题而后设计实验去检验之?
感悟2
我在这两年的博士学习期间,逐渐认识到科研与人的密切关系,其实科研的主流是受少数人物引导和操纵,站在最前面的几个就是媒介称作科学家的人物,因此新手如果想有什么突破,那就应当将自己的目标定在这些人物的身上,首先是研究和分析这些人物的研究历史,该过程其实就是你迅速掌握该领域的研究进展的最佳途径,因此研究首先从人开始是新手开始个人研究的最有效途径,同样,你对该研究领域著名人物的研究了解程度就代表了你当前的科学思想水准。我建议,新手查文献,不要只是死盯关键词,而是死盯科学家,前者可能会搞乱你对改研究领域的认识,而后者却使你很快走上征途。
感悟3
关于诺贝尔奖
诺贝尔奖反映的是重要的发现或发明,获得该奖的人员大多数岁数比较大,奖励的是他们1030年前的工作,而中国的科研真正起步也就是这1030年的事情,刚刚起步的工作就希望获得诺贝尔奖有点异想天开。我希望中国大陆的科研人员获奖,但是就目前而言,我们的工作还没有达到这样的高度,前人在这1030年的时间给我们年轻人造就了比较好的科研环境(相比老一辈的环境),希望年轻人发挥自己的聪明才智冲击科学颠峰,不要总是埋怨客观的差别,多在思维智力方面下功夫,许多诺贝尔奖获得者的工作并不是在成千上万元的基础上获得的,而是他们的聪明才智起决定作用。例子很多,随便举例:PCR技术,癌基因的发现,今年生理学医学诺贝尔奖等,他们的工作重要性主要体现在选题和实验设计上,不是用钱堆积起来的。因此总是将客观或者金钱放在首位作为我们科研不进步的主要原因是客观论者,有逃避责任之嫌。希望年轻人意识到这一点,充分发挥主观能动性努力拼搏,慎重选题,精心设计,一定会获得意想不到的成就。
感悟4
假如我是研究生导师,我会对研究生采取下列措施:
1
)学校开设的所有公共课程可以不上;但是必须多看文献,特别是阅读那些著名科学家的研究论文,了解这些科学家的研究历史,明白他们有什么发现,怎样发现,分析他们对发现的解释,比较不同科学家对同样发现的不同看法,分析具体原因,等等,让他们明白什么样的发现是重要的,什么样的发现没有价值,始终贯彻思想永远走在实验的前面。
2
)提倡鼓励学生挑战权威,挑战现有的理论体系,挑战一切重要的思想和发现,因为科学的本质就是推陈出新。
3
)做什么课题由学生选择和提出,我得任务就是从思想上刁难他,不断提问,学生不能回答,则学生应当继续完善课题或选择新的课题,直到有一天我不能难道他,那就可以开题了。
感悟5
现在我已经是博士第二年,明年就要毕业了,从1999年上研究生至今,一直读书做实验,硕士期间没有思想,实验是照葫芦画瓢,博士期间偶然碰上科学“怪人”DUESBERG使我迅速对肿瘤产生了兴趣,在他的文献的刺激和引导下我看了许多关于肿瘤方面的文献,认识了许多科学家,现在想起来觉得也算是一种收获,随着对问题的深入了解,发现能够与自己探讨问题的人越来越少,真有一种孤独的感觉,这样走下去,将来一定越来越孤独了,难倒科研就是一

 

感悟6
剩下3个月就要博士毕业了,正好可以总结一下这6年来的经历,让自己明白自己究竟做了些什么,算算6年过得是否值得。
我们的实验室条件很差,记得当初只能做细胞培养,所有的分子生物学的内容都不能作,我硕士毕业做的技术就是转基因和免疫组织化学,加上流失细胞技术。硕士毕业时连pcr都不会。技术没有学到,理论是否学到什么?基本上也是零,因为我得研究是关于肿瘤的研究,导师不管什么是肿瘤,只是从国外某个研究人员那里拿来一些新的基因和抗体,交给我和我得师兄,让我们用这些研究肿瘤,当时学生期间认为这就是所谓的研究了,但是现在想想这是在开玩笑,拿几个基因几个蛋白转来转去就是所谓的研究了?那些所谓的研究其实就是让我们混毕业罢了,对于肿瘤的研究是没有一点点价值,难怪我得硕士课题被香港某个教授称作funny.
后来我终于明白了,我们的研究问题的症结所在,我们的课题选择简直就是xx,从来不问为什么要这样作,为什么做这个不作那个,只是要结果,没有意义的结果即使再多又有什么用?后来明白了,研究最难的是课题的选择,不是后面的实验技术问题。好的课题,具有挑战的课题,哪怕只有一个结果,也是令人肃然起敬的结果,至少没人敢说这是funny
我不情愿的上了博士,还是我得硕士导师.不同的是我对自己提出新的要求:首先解决思想问题,然后选择课题进行实验。思想问题是:什么是肿瘤?肿瘤的研究历史演变过程是怎样的?大约8个月的时间什么也不作,就是看文献,看了成百上千篇文献后,终于明白肿瘤的具体研究历史演变过程,终于明白什么样的课题是重要的,什么样的课题是xx。后来决定做实验,第一次设计实验,没有人指导,感到很快活,但是对前途的感觉太过于乐观了,虽然实验结果比较理想,但是实验设计太粗糙了,不得不重复实验,我得实验周期是8个月,这下可苦了,经费短缺,时间紧迫,可是为了自己的理想我仍然决定重复,现在就在等着这个结果。
花了6年时间读了一个硕士一个博士,但是学到什么呢,硕士期间简直没有什么收获,博士的收获就是多读了几篇文献,懂得了什么是科研。
以后决定做实验之前,首先在提出问题上下功夫,然后设计精巧的实验来解决。没有价值的问题,决不做实验,宁可读1000篇文献,不做一篇没有意义的实验。

感悟7

 

当前生命科学研究方面存在很多愚蠢的盲从行为,很多导师给学生的题不是从具体的客观实际出发,发现问题,分析问题,提出解决方案,而是随便找个基因什么的就开始所谓的实验,这样的实验即使能够发表高档次的文章,也不见得能够解决什么问题。问题自有其内在的主要矛盾,我们不是从主要矛盾出发而是从一些细枝末节出发,美其名曰为先进的科学实验,我记得中国一位院士这样说:等到细胞信号转导的通路完全搞清楚,肿瘤的问题就解决了,这种没有分析,妄加判断的做法是很多学者的一贯做法,真的是这样吗?我看不见得,不是从问题的主要矛盾出发,不可能解决问题。希望我们的研究能够有自己的思想,自己的思路,才可能称得上真的研究,才能够对得起纳税人的血汗。

 

感悟8
科学是什么?怎么做科学?s什么是真理,怎么追求真理?

 

对于什么是科学,每个人有不同的答案,说明大家都没有找到科学的共性(所谓真理)。我想,认识科学与认识我们最常见的事物的方法应当一样,与我们如何认识自己的朋友或敌人的方法一样。这种方法就是对比的方法。没有对比,我们没有办法认识朋友或敌人;没有对比,我们无法认识星星和月亮;同样,没有对比,我们无法知道什么是科学。因为对比,科学是相对的;因为对比,科学是绝对的。所谓相对和绝对只是对比的对象更换而已。

 

西方的认识事物的方式是对比的认识方式。比如,为了研究物体的运动,牛顿假设一个参照物;为了研究物体之间的空间位置,几何学设立坐标;为了研究疾病,必须有解剖学,生理学等正常的知识,判断疾病就是看机体的那些成分改变了;等等。离开对比,不可能有西方的科学。

 

那么除了对比,我们人类还有没有其他的认识事物的思维方式?我不知道。不知道各位是不是可以举出来。

 

如果对比是人类认识事物的唯一方式,那么,判断好坏、真伪的最简单方式就是对比。

 

不过,如果对比是人类认识事物的唯一方式,那么为什么呢?????

 

中医的理论和算命的方法中超科学的成分是什么认识方式?

 

经过个体的不断对比,人类会发现有些事物类似。为了记忆、学习、传授简单,人类按照这些事物的共有特征归类,于是有了分类学。分类学(按照共性归类)一下子简化了认识的程序,为人类更好的选择自己需要的事物提供了有效的方法。

 

但是,经过更细心的对比,发现这些事物中的共性也有差别,于是再进行共性对比,选择更加有效的共性,更好的共性,以便更好的指导人类选择自己的需要(选择时的标准就是共性)。由于共性具有简单有效的特征,人类会因为受益而开始有目的的寻找这类性质,于是有人说出了追求真理。虽然实际上就是追求更好的共性。自然而然,追求真理的方法就是对比。当然不知道是不是还有更好的办法,可能上帝知道。

 

没有对比,没有西方的实验;没有对比,没有西方的科学;没有不断的对比,没有西方科学的不断发展,没有对比,没有通往真理的道路。

 

离开比对,人类不会认识事物,更不会有任何新的认识。说什么是什么,什么不是什么,都是比对的结果,没有比对,随意乱说,是混淆认识的诡辩。

 

数学的本质是语言的转换,本质上并不产生新的东西,只是转换后更容易把握。这句话只是一个假说,欢迎批判。

 

只有比对存在的具体事物才可能有新的认识,不断的比对不断的接近真相。比对不存在的事物,不可能有新的认识,比如比较鬼与神,大家都没有见过,无法具体比对,因此无法认识。科学一定是对存在的事物和规律比对的结果。中医的阴阳五行和周易的八卦没有具体指代任何事物,又可以指代任何事物,本质上是一种循环论,或者诡辩论。因为什么都可以指代,但是又什么都不指代,导致无法比对,导致没有具体事物的比对,导致不能具体问题具体比对,最终陷入诡辩的泥潭。这就是中医理论的本质。如果说,中医中真正有效的药物,那不可能是中医理论指导的结果,定有其他的解释,本质上离不开比对。
世界是人的世界,人的进步决定于人的思维方式,人群的进步决定于人群的思维方式。我们的思维方式是什么?我们下一步怎么办呢?我们是不是知道什么是科学,怎么做科学了?

 

感悟9
科学的目的从本质上来说是解决哲学问题,即超前的思想问题,从历史看,人类对事物的哲学认识远远超前于科学的认识,今天,表面上科学已经在日新月异的爆炸性进展,但是与具有无限想象和严谨的逻辑思辩结合的哲学对世界的无极认识来说还相差很远,医学人员的哲学素养普遍并不怎么高明,大部分还是原始的(非专业)哲学加上一些辩证唯物主义,况且,很多人其实对辩证唯物主义只是肤浅得了解(这种认识还不如不认识,因为这样的认识最容易导致不可知论和教条主义,即胡乱运用),这样得哲学思想水准可能是当前很多研究人员的科研不能进步的根源。国内很多实验并没有首先进行专业水准的思想思辩和逻辑深思就盲目开始,这种将收获建立在肤浅思想认识和幸运机会来历的基础上,不可避免导致悲剧结果。虽然一些研究人员认为科学历史上有幸运机会的存在,但是整个科学史并不支持这种论调,并且人类的不断进步不可能总建立在机会主义的基础上。因此实验前进行思想锤炼非常重要。

 

感悟10
1
)科学的本质是层次的解释,现在生物学主要在物理和化学水平层次(分子生物学的本质)分析生命规律,没有超过薛定鄂3040年代提出生命的本质的概念,现在的任务是全面系统的在分子水平上分析生命,为生物工程提供资料和信息,为将来影响和改造生命建立基础。
2
)当前学术领域的***等问题其实是中国经济改革政策的映射,问题的根源不是学术领域的人的怎么样,而是社会私有化进程中原始资本积累的一种方式,因此大的气候不变,学术***不可能根治。这个本身也是一个需要科学分析的问题。
4
)科学的过程一般是:初步的哲学思考(对资料理论思辩和逻辑分析)--确立明确研究目标和现实技术方法的内在联系(即确定的研究目的可以用现有的技术来解决,不然目的就只是假说而不能变为科学,因此我认为科学的本质是立足现实寻求未来的学问和艺术,因为这样的关系,科学的研究必须熟悉科学的历史过程,只有对科学的历史有深刻研究的人才能够理解科学和技术的建构主义是什么意思,才能够把握科学的脉搏、动向以及未来趋势。不然,就会迷失方向和思维混乱。)---问题的深入研究导致工程学的产生--为人类服务。
总结:思想--科学--工程--利益---------
5
)成熟的学者思考的方式是破和建,破就是打破旧的,建就是建立新的,可惜最近总是看到很多战友只是骂娘,但是从来不在骂了娘之后提出建设性得意见,可能从来没有这种想法或者没有能力,骂娘不是解决问题的根本方法(记得有人说过骂人不是战斗)。因此我说除了骂,还能提出更好的办法才是值得尊敬的行为。自五四以来,中国知识分子就以骂祖宗为本领(至今仍然这样),但是骂的人有几个建立了中国人的新的思想方式和规范?没有,至今没有,结果产生的却是国人的自卑(至今在洋人面前没有自信,不论科学还是思想),这种自卑产生没有自信,没有自信产生没有独立的思想,没有独立的思想,就没有真实的胆略和胆识,没有思想和胆识造就了多年来我国在学术思想方面没有突破和超越,这其实正是我国学术落后的真正思想根源。因此我认为,当前我国学术思想不能正常发展和超越,主要问题在于思想的迂腐、胆怯,物质条件落后不是主要根源。
6
)学术是需要基础的,这里的基础主要指学术的历史脉络的联系,现代科学在西方发展了很多年之后才传到中国,中国精英开始积极学习,可惜自1840年到现在,学了近200年,依然没有将精髓学到手,往往学了一点,就自满,就停止了学习,其实我看我们目前在科学上进步不大的一个重要原因是,没有系统的学习和批判吸收西方的学术等历史的结果,要知道科学等学问其实都是类似带线的风筝一样,如果我们只是看到风筝的美丽和在太空的飘扬,只是学习风筝,就会因为没有线而不能飞的更高更远,而是没有后劲,最终稀里糊涂栽跟头。

感悟11
创新问题可以比作生物进化问题,生物进化需要遗传变异和环境选择,创新也需要“遗传变异”和“环境选择”。但是科研创新的“遗传变异”是什么呢?应当是思想的变异。科研创新的“环境选择”是什么呢?是实验和实际应用。
首先说说思想变异,在讨论思想变异之前先看看遗传变异,遗传变异主要是染色体和基因序列的变异。基因序列变异比较常见,并且每天都可能存在变异,影响基因序列变异的因素很多,有其自身的不稳定性,有各种致突变因素如各种物理化学以及生物因素等,不过主要影响还是来自外来因素,即外界环境的变化。同样,思想如果不及时和不间断吸收外来的信息,就不可能发生改变。微小的环境变化只引起基因序列的微小改变,这种改变对于生物影响不是很明显,只是物种内部的个体的改变。同样,少量外来信息对于思想的影响也只是微乎其微,只是修改一些思想的细节。巨大的环境变化,引起生物染色体数目的改变,就可能产生新的物种。同样,大量外来信息进入大脑,就可能完全推翻原来的思想,进而产生划时代的新的思想。看来,思想的进步离不开不断充入外来信息,信息的多少可能决定思想的变异程度,而停滞充入信息思想可能就停止不前了。从这个道理出发,反观我国科研现状,就会很容易发现我国很多所谓的学者其实其思想已经很多年没有充入新的信息了,但是他们却指导研究生做科研。我们的研究生呢?很多研究生从内心来讲非常讨厌文献,非常赖于思考,他们急功近利,宁可多跑路,也不愿意坐在板凳上认真给自己充电、充入新的信息、改变自己的思想、改变自己对问题和事物的认识。因此,科研创新不进步的首要问题是:大部分科研人员懒于充入新的信息,从而没有思想变异的遗传基础,自然没有科研的创新。
只有不断输入外来信息,首先引起思想的变异,产生创新思想才可能去做实验来验证思想是否与实际切合。可以说,创新的本意主要是思想的创新,没有新的认识,实验就无从谈起。
综上所述,我国科研创新落后的一个重要原因是研究人员停滞新的信息输入,思想僵化所致,是主观上的问题。

 

感悟12
以前我说过,研究生进入研究领域最好最快的方法是研究著名科学家的研究历史和他们的思维方法,因为人类对自然的认识是一个历史过程,刚开始搞研究的人员,即使再聪明,其对特殊领域或事务的认识是处于一个很低的水平,可以说还处于朦胧阶段.对于以前的研究历史不清楚,必然不会知道自己的研究从那里开始才具有重要的价值,也不会知道什么事情是值得付出自己宝贵的青春和研究经费,必然不会有自己的具体梦想.世界上需要做的事情很多,但是值得自己付出的有多少呢?世界上许多事情在发生,但是有多少能够影响到社会,自己和他人?世界上每天都有很多事情发生,有多少是具有真正的价值?我们都是年轻的一代,总希望改变自己和不满意的社会现状,但是我们从那里开始?我们做了什么事情就可以达到自己的梦想?有谁会告诉我们我们应该怎样做?能够改变社会和自己的事情一定是大事情,一定是艰难的事情,但是不一定是很清晰的事情,或许我们只是对其有个粗略的认识但是其真实的面目我们还远远不清楚,比如肿瘤,攻克肿瘤无疑是一件非常重要的事情,但是肿瘤是什么?我们做到了那一点就可以致肿瘤于死地?这一点存在不?存在?又是那一点?因此一个问题,一个大的问题后面是无数的问题,并不是一个非常简单的事情,而在这无数的问题当中,你认为那一件是具有决定作用的事情,那可能就是你研究的出发点了,无数研究人员对事情的认识存在很大的差异,因此存在不同的研究思路和出发点,这些就是我们新手需要了解的,在他们毕生研究的基础上,加上我们的努力,就可能获得成功.成功不一定属于老年人,不一定属有具有几十年研究历史的研究人员,不一定属于具有上千万甚至上亿元资助的所谓首席科学家,属于有志向和思维活跃的年轻人,只要我们在很短的时间内掌握现在的研究现状并形成自己的研究思路,寻找到具有决定意义的交叉点,只要我们轻轻一碰,就可能改变世界.事实上科学的历史告诉我们那些具有改变世界的科学成果不是年龄,研究历史的长短,以及巨额资金的堆积起决定作用,而是我们的思维起决定作用.看看相对论,PCR,windows等的产生过程,就会明白这个道理.
感悟13
很多研究生开始做实验之前,对科研充满兴趣和热情,但是一旦过了3年,有几个人还会说:我仍然喜欢搞研究。100个人会有99个回答再也不愿意回到实验室。为什么?实验伤害了他们的感情?研究条件限制了他们的手脚?为什么我们的兴趣这么短暂?我们对自己没有信心?国家的政策不利于进行科学研究?研究领域的一些老古董伤害了我们?我们年轻的心就这样容易衰老?没有人给我们指引一条通向科学顶峰的路?经济问题大于我们的理想?没有什么值得我们为之付出?到底为什么????
我马上就要毕业,只想说说自己的体会:
研究是个人的兴趣问题,更是个人的理想,信念,能力以及价值观的问题。世界上人人都在做一件事:付出就应当回报,搞研究自然也不能脱离这个规则。研究是无中生有,谁有这种能力和决心,谁必定愿意做研究,没有这种能力和决心,必然不适合搞研究。
研究是纯粹个人的事情,个人喜欢搞什么研究就搞什么研究,搞研究至少分两步,一是收集资料,了解分析总结研究现状,之后提出自己的研究方案。对现实了解的多少,提出问题的程度和深度决定了实验的价值,因此研究人员首要重视的是课题的选择问题。有谁真正为这个问题付出代价,我想思考学习3个月甚至1年的学生和只是思考学习1个月的学生提出的研究课题一定会存在巨大差别。因此做实验之前,首先要问自己,为什么要做这个试验,为什么不做其他的实验,世界偌大,未解决的问题很多,我们为什么选择这个课题而不是其它。我们有选择的权利,为什么在做研究的时候,在我们有自由选择的时候,我们要放弃,要轻率,要不付出思想的努力?为什么我们在选择课题的时候总是轻视自己,不是选择具有深度和挑战的课题,不是决心挑战现在的旧观念和现在的权威,而是俯首称臣和缝缝补补?做研究就是挑战和反叛,历史的进步反映了这个事实,伽利略挑战上帝,爱因斯坦挑战牛顿,马克思挑战资本主义,Temin挑战中心法则,Hayflick挑战细胞永生化,Duesberg挑战肿瘤基因突变学说。世界上没有真的法则,法则只是人类为了自身更好的认识和改造世界自己订立的法则或条约。研究人员其实就是自然的法官,世界其实就是研究人员的想象。我们生活在研究人员为我们创造好的世界中,因此我们并不是处于真实的世界中。我们看问题的思想是别人的思想,我们对问题的评价和判断标准是他人制定的,我们的道德标准,我们的社会模式,我们对自然的认识从来没有离开过那些思想处于最前沿人员的影响。谁在领导和引导世界潮流,谁在引导人类迈向未知世界?我想应当是具有卓越贡献的研究人员。研究既然是这么重要和有趣的事情,我们为什么会很快憎恨搞研究呢?

 

感悟14
关于科研我想再说一些意见。
1
)科研本身并不仅仅是实验,不要以为实验就是科学。其实科学的本质是思想过程,是提出问题、推测答案、然后证伪的过程。没有经过思想的严密推测,没有对问题深刻的观察和分析,就无法设计具体的实验来证伪,就无法知道到底我们做了什么样的实验才算是具有真实的科学意义。
2)
对于初学科研的人员来说,通过系统分析某些著名科学家的文献,理解他们多年的思想动向,推测他们的思想理念和思维方式,是接近科学的有效捷径。科学的本质不是知识,而是思想动向和脉络,,只有当我们的思想接近、达到甚至超越著名科学家的思想动向的时候,我们才可能真实的获得了科研独立人格,我们才真实的走进科学的历史主流。
3
)科学思想是有历史渊源的,科学的概念是有坚实的基础,他们相互构成稳固的系统,我们的科学就是在这些已经坚固的概念系统上再建新的概念。看不到这些概念的来龙去脉,就会思想认识混乱,就不可能建立起能够与以前那些已经建立的概念的真实联系,因此不能算是有价值和意义的科学。
4
)科学的成长不依赖自身的理性,他的动力来自人类的感性(情感),人类的真实世界是感性的,即使有理性,理性也不能摆脱感性的控制。我们的一切理性行为背后都有复杂的感性基础(感情基础)。
5
)科学研究的对象都是稳定的存在,稳定的存在的本质是可重复性,因此科学有叫可重复性学问。世界上很多事务没有重复性,要在这样的领域建立科学可能是一个难题,这些领域的指导思想可能主要是哲学而不是科学。

 

感悟15
高等生命存在不同的层次:生物物理化学层次、细胞层次、组织器官层次、机体整体和精神层次。
问题:1)一切高等层次的现象都可以用低等层次的道理来解释,一切高等层次的理论不能应用于低等层次的理论?为什么?
2
)一种疾病的解释有没有最好的层次机理的解释?为什么?
3
)跨越层次之间的理论解释是否更加困难?例如,应用物理化学规律解释细胞的生命行为可能相对于解释人类的意识更加容易?为什么?

 

感悟16
关于研究生的课题选择和实验问题:
最好不要心急,沉下心,三个月阅读文献,不少于200篇,精度自己感兴趣的。三个月写实验计划,实验目标必须明确、具体,实验方法切实可行。
最后做实验。
文献阅读少,会给后续工作带来完全意想不到的问题,甚至换题。
我想所谓试验,不是你动手做才叫试验,其实实验分两部分,一部分是理论部分或者实验设计部分,一部分是试验部分。如果理论部分能够解决就不必实验来解决。其实最难的是实验设计部分,而不是实验操作部分。可惜很多中华儿女不能意识到这一点,一上来不看文献或者匆匆一看就开始做实验,并认为那就是所谓的试验了,其实这是一种非常荒谬的做法,也是思维没有受过科学训练的表现。其实实验设计部分才是需要花费时间和精力的,这一部分工作做好了,作细了,下面的部分就会很容易操作了,结果也不是一般的结果了。
感悟16
教科书的知识统合水平是造就高级人才的基础,我国教材的脱节性是学生顺利成为高级人才的一个隐蔽的障碍。
思想是整体的和系统的,学习消化吸收不同方面的思想是实现思想成熟的必由之路包括哲学的、化学物理、等等。
个人的认识过程反映了人类的认识历史过程,就像发育反映种系进化过程一样。
真正的知识存在于自然和我们的心灵,书籍和文献只是引导我们通向我们应该去的圣地。

感悟17
人类的伟大在于什么?
人类的伟大在于在于其积累效应。没有资本的积累无法进行经济活动,没有知识的积累无法进行知识创新,没有生产资料的积累无法完成现代化工业革命。
对于个人,积累仍然是其一生中最大的法宝。知识的积累可以成为学者,金钱的积累可以成为资本家,***资本的积累可以成为***首脑。
没有积累,没有不断的积累,不会进步,不会飞跃,不会成功,只能原地踏步,一事无成。
积累需要长期坚持,但是短期迅速的积累并非不可能,而且短期的迅速而有效地积累会造就伟大人物。
创新是积累的产物、不断小的的创新的集合的产物。相对论、进化论、万有引力定律不可能是一夜之间的产物,而是多年在此方面积累的结果。
总之,人类之所以伟大,在于其具积累的习惯和方法,伟人之所以为伟人在于其独特的积累方式、方法和习惯。
感悟18
中国为什么没有发生工业革命???????????????

 

我得观点:中国没有科学是没有工业革命的主要根源

 

科学的开始纯粹是个人的事情,之后才是科学的协作,即使在目前,科学的进步还是少数几个人甚至就是某个人突破的结果。将科学推给***和经济都是没有道理的。

 

工业革命的核心是技术的诞生,可是技术如果没有科学思想的指引,依然不会诞生,更不会不断繁衍壮大。所有商业和工业的秘密都存在于技术之中,没有技术就不会有商业和工业。

 

而技术是科学思想儿子。

 

因此没有科学是工业革命不能在中国产生的主要根源。

 

如今,技术的引进繁荣了中国经济,但是自己创新的落后成为我国工业和商业的最大阻力。

 

现在还可以到处看到那些没有科学的国家依然没有工业

 

也可以看到一些新兴的国家都是建立在新的科学技术革命的基础上。

 

因此,科学是立国之本,是强国之本,是工业革命的本质
感悟19
我自己认为,科学的别名就是苛学,是严苛的学问。我这样说,是因为,学问要成为科学必须经过很多科学家严苛的提问和挑战,直到没有办法挑出毛病,才成为科学(接近真理)。因此,科学的最大特征就是愿意接受各种挑战。只有伪科学和骗子的学问才害怕别人提问,害怕别人挑战。

 

因为这个特征,要理解和掌握科学,必是艰难苛刻的过程,要发展科学必是更加艰难苛刻的过程。因为这个特征,理解科学的人必然只是少数人,能够运用科学利剑的人,更是凤毛麟角。科学本质是大浪淘沙的结果。科学是淘金的学问。由于这个特性,人类对科学更多的是尊敬和崇拜。由于这个特性,新的深刻问题必须挑战现在被认为的真理,使得研究人员提出有价值的问题越来越难,也就是说,能够提出具有新性质的问题都比较艰难了,更不要说解决新性质问题。也正是这个原因,科学问题解决具有进化的特性,即总是在原来的基础上再进一步,这样坚实的一步步征服自然,其可信度和其战斗力自然天下无敌。
感悟20
西医强调客观事实重要于理论,必然承认客观标准。任何事物都有个性和共性,个性是事物区别于他物的特征,共性是事物共有的特征,是事物分类的依据。西医最看重的是事物的共性而不是个性,因为识别共性可以简化认识,可以简化解决问题的程序,一个事物的共性解决了,一类问题就解决了。因此,西医最最看重的是研究人员解决的问题是不是新性质的问题,只有首先发现新性质问题,并提出解决办法的人才是最值得尊敬的人,因为他实际上解决了一类问题。因此诺贝尔奖获得者几乎都是解决这类问题的人。解决新性质的问题,需要最简单有效的思想和实验模式,西医研究总是从最简单的模式开始研究新性质的问题,这样可以去除不必要的干扰因素,几乎剩下来的就是新性质的问题在起作用,将这个问题研究通了,一类的问题就研究通了,不论该问题发生在自然界什么地方,都是这个规律,不论这个疾病发生在张三还是李四身上,不论是鸡的病了还是牛的病了,不论是虫子还是猴子,都可以解决,这就是西医追求求解事物共性的最坚实理由,因为共性具有简单有效性,攻击型,征服性,扩展性,遗传性,进化性的特征,因此一旦找到一类问题的共性本质,就可以完全占领这一阵地。由于追求事物的共性,因此其认为科学或者真理的标准就是事物的共性而不是个性。也就是说,共性就是标准,深刻的共性是深刻的标准。例外的事物一定具有新的性质,这就是西医需要解决的另一类(另一性质的)问题了,也是西医认为最需要解决的问题和最重要的问题。正是对事物共性的追求,一旦认识就完全占领,正是西医多年来星星之火可以燎原的深刻根源。
条孤独之旅?

 

研究生回顾日记1
回顾新假说的形成过程
2003年12月17,突然一个灵感触发了压在我心里近2
年一直悬而未解的肿瘤干细胞增殖机制问题,使我意识到非整倍体可能是肿瘤干细胞扩增的重要机制,而不是肿瘤发生后的一种表象或结果。该假说很快得到我校2003年博士学位论文课题资助。

2000年6月我开始查阅资料准备完成我的导师给我确定的硕士课题:RGS16与胶质瘤的关系。可能由于我的做事习惯总是将简单问题复杂化,该课题促使我开始大量查阅关于RGS16G蛋白的文献,发现大多数文献是关于G蛋白的信号转导问题。当时关于G蛋白的研究已经非常深入和复杂,在该方面研究成果获得诺贝尔医学奖已经有好几次,但是我还是怀着满腔的热情去查阅这方面的文献,希望象门捷列夫通过绘制元素周期表来预测新的元素的存在一样通过绘制信号转导通路来发现或预测新的信号通路。后来证明我的想象基本正确。大约在20009月左右,当时与我们实验室合作的XX教授还在新加坡国立大学任教,他应XX邀请以访问学者身份到我们教研室访问。

林教授在Nature杂志等著名杂志上发表过多篇文章,是一名年轻的生物学专家,我很高兴能够向他请教我实验方面的问题。我推测TNFalpha可能能够诱导RGS16表达,如果能够证明该推测,则会首次证明TNFalpha信号转导通路与G蛋白信号通路之间具有交叉反应。我的实验方法是用TNFalpha作用C6胶质瘤细胞后用免疫组织细胞化学方法检测RGS16的表达情况,但总是没有实验结果,我将这个想法告诉

林教授后,他迟疑了一下,说这个实验很有意义,遗憾的是他并没有继续讨论这个问题而转向了其他话题。不过3个月后他在Biochem J.杂志上发表了 TNFalphaRGS16的文章,(2000 Dec 15;352 Pt 3:747-53.),原来他早在这方面开始实验,而且他的实验方法要比我的实验方法复杂精确许多。这次经历虽然以失败告终,但是它使我相信自己的推测在一定程度上是正确的。因此只要有足够的事实证据和合理的逻辑推理,就可以大胆设想和推测许多悬而未决的科学问题。要做到这一点,首要的问题是必须非常清楚前人的研究进展,大量阅读文献可能是唯一出路。
为了完成硕士论文课题,我还必须清楚肿瘤发生的普遍机理和胶质瘤发生的特殊机理。由于教科书以及大量文献都是关于基因突变与肿瘤发生发展的关系,我也理所当然认为肿瘤的发生是基因突变的结果,虽然也看到信号转导,凋亡,细胞周期等与肿瘤关系的文献,但是它们都是基因突变学说的衍生学说,这些理论给我们绘制了美好的前景,但是我们自身总感到将要坠入不可知论的深渊。不管怎样,在200212月之前,信号转导理论是我的思维工具,我不得不用它来解释我的实验结果以及肿瘤的发生机理。
2001
年末,我偶然看到通知申报国家自然科学基金的通知,经过几天考虑后决定写一份,但是写什么内容心里没有谱。虽然硕士期间一直跟踪G蛋白的研究,但是关于G蛋白的研究并不能激起我的兴趣,于是到图书馆随便查阅资料,幸运的是翻阅Nature杂志时,发现了一篇题为:Stem cells, cancer, and cancer stem cells.2001;414(6859):105-11.)的文章。这是我第一次看到肿瘤干细胞(cancer stem cells)的概念,但是它很快吸引了我,直觉告诉我只要揭示肿瘤干细胞的秘密就等于打开了通往解决肿瘤根本问题的大门。在这篇文献的指导下,我开始查阅关于肿瘤干细胞的文献,奇怪的是大部分是上世纪7080年代的文献,进入90年代后文献很少。为什么90年代之后没有人再研究这个问题?是不是肿瘤干细胞本身就不存在?或者其它理论代替了肿瘤干细胞学说,但是文献并没有说明这些问题。不过值得庆幸的是在查阅资料的过程中,偶然发现Sherley 的文献报道p53可以诱导永生化细胞从指数分裂方式转变为成体干细胞的线性分裂方式(Proc Natl Acad Sci U S A. 1995;92(1):136-40)。于是处于茫然之中的我决定应用基因突变学说解释肿瘤干细胞现象。因为教科书认为癌基因的激活和抑癌基因的失活是肿瘤发生的根本原因,因此我推测细胞不断分裂依赖癌基因信号的持续刺激,但是细胞的不断分裂不可避免激活抑癌基因,由于抑癌基因产物会导致细胞丧失增殖能力,因此细胞必须对癌基因产物和抑癌基因产物进行不对称分配,导致获得癌基因产物多的子代细胞成为肿瘤干细胞,相反则成为普通肿瘤细胞(这些细胞最终因为分化而丧失增殖能力)。该假说的文稿当时投到《科学通报》,第一次审稿批示为具有一定的创新性,给我很大的鼓励,但是很快第二次审稿批示为拒绝发表。
2002
年末,又到了申请国家自然科学基金的时候。虽然在这一段时间我一直对自己的被拒绝发表的肿瘤干细胞假说念念不忘,但是不断地看到关于基因组不稳定与肿瘤发生关系的文献,促使我去查询这方面的资料。有一次我在随便翻阅一篇中文综述时,偶然看到肿瘤发生的非整倍体假说,虽然该综述只是简单的提及了一下,但是关于肿瘤发生还有其它假说对于我来说还是第一次碰到,好奇心促使我查阅其文献索引,更令我吃惊的是该文献的题目竟然是: Aneuploidy vs. gene mutation hypothesis of cancer: recent study claims mutation but is found to support aneuploidy.(Proc Natl Acad Sci U S A. 2000 ;97(7):3236-41.)。是谁竟然如此神勇挑战基因突变学说?Peter Duesberg,一个著名的病毒学家和典型的反传统主义的科学家,曾经因为宣称艾滋病的直接病因不是HIV感染而“名誉受损”,虽然至今他仍然坚持自己的观点。他是最早开始研究病毒癌基因的科学家之一,对癌基因学说有一定的贡献,但是1983年左右他开始质疑癌基因学说(Nature. 1983 ;304(5923):219-26.),于1997年提出肿瘤发生的新的非整倍体假说。原来非整倍体假说早在1890年由D. von Hansemann 提出, 1914年由T. Boveri完成,只是上个世纪7080年代癌基因和抑癌基因时代的到来使许多研究人员逐渐放弃非整倍体假说,或者认为非整倍体只是基因突变和肿瘤已经发生后的结果,或者认为非整倍体与肿瘤关系不明确,其重要意义还没有被人们发现。遗憾的是现在的教科书很少和不再提及该假说。新的非整倍体假说的主要观点是:肿瘤发生的根源是非整倍体导致细胞内大量正常基因表达量和比例的失衡,而不是少数个别基因独立的突变。该假说不是继承或修正而是要否定基因突变假说,因此在肿瘤学界被认为是与基因突变学说并驾齐驱的一个假说。
非整倍体假说的发现使我对肿瘤研究的兴趣增加了许多,现在仍然记得那时阅读Duesberg的文章时的兴奋情景。我与很多同学讨论该假说,发现竟然没有人知道该假说。网上查询发现除了上述那篇中文综述提到该假说外,在所有中文杂志上竟然没有该假说的影子。要知道该假说发表于1997年,5年过去了中国的肿瘤学界对该假说竟然不知道或者没有理睬,包括曾益新主编的研究生教材《肿瘤学》第二版也没有提及该假说,可见基因突变学说的统治地位。我立刻决定编写一本关于该假说的书,为了尽快出版该书我四处寻求合作者,主要是我的同学,但是他们都没有时间来考虑该问题,后来我决定一个人来完成该书。在翻译Duesberg等人的文献过程中,我意识到只是宣扬该假说并不能解决根本问题,一个重要的问题是如果不熟悉基因突变学说的内容和历史演化过程,不可能使人相信非整倍体假说的科学性,于是在研究非整倍体假说的过程中同时开始搜集基因突变假说的文献。由于关于基因突变学说的文献浩如烟海,要穷尽这些文献几乎是不可能的事情。这时我发现自己已经将自身推到了一个自己编制的巨大“陷阱”的边缘,是前进还是放弃?博士毕业需要实验结果和发表文章,这些需要时间,同样,研究这些学说需要更多的时间,最快速度一整天也只能阅读68篇文献,并且不一定能够完全理解全文的意思,有时一篇文献需要阅读好几遍才能够理解其内在的含义,这样算来需要几年的时间才可能完成。经过几天考虑,我意识到科学研究的过程其实也就是人类对新事物和新规律认识的过程,走在最前面的只是少数科学家,因此只要能够找到这些著名科学家发表的文献,基本上就能够清楚该领域的研究历史和进展脉络,但是怎样才能够找到肿瘤研究领域的著名科学家呢?最后想到能够获得大奖的科学家一定是做出过杰出贡献的科学家,这样很快想到诺贝尔医学奖,随后找到与肿瘤研究相关的其它著名奖项,顺藤摸瓜很快就认识了许多著名的科学家,同时了解了他们的工作以及他们当初怎样开展自己的工作,在这过程中自己渐渐摸索到了科学的真实历程。由于找到了有效的方法,我干脆决定对肿瘤的研究更应当彻底一些,除了学习那些著名科学家的工作外,还决定对国际著名杂志如Nature, Science, Cancer research 等杂志上面发表过的关于肿瘤的综述进行全面分析。从2002年末到20038月历时近8个月的时间使我对肿瘤有了比较明确的概念,并且发现关于肿瘤的假说有很多,除了基因突变假说和非整倍体假说外,还有适应假说、肿瘤干细胞假说甚至还有认为基因突变是肿瘤发生的结果而不是原因的假说。各派假说林立,表明肿瘤的病因和发病机理并没有完全确立,促使我决定自己建立肿瘤发生机理的新假说。
其实在肿瘤发生机理的假说中,影响力比较大的主要有:基因突变假说,非整倍体假说,表遗传(epigenetic)改变假说。这是因为肿瘤细胞中总是存在基因突变,染色体结构和数目改变以及表遗传改变。关键问题是到底那种改变是肿瘤发生的启动改变,而其它改变只是后续结果,或者那种改变决定肿瘤的存在和演进。奇怪的是这些改变与肿瘤干细胞的关系几乎没有论述过。肿瘤的一个普遍现象是不论肿瘤组织还是肿瘤细胞系,能够维持它们存在的生长的只是占少数部分的肿瘤干细胞,其它肿瘤细胞最终会失去增殖能力而衰老死亡。该现象与正常组织中只是存在少数成体干细胞现象类似,但是肿瘤干细胞与成体干细胞是什么关系并不清楚,只是推测或部分证实肿瘤干细胞来源于成体干细胞,但成体干细胞怎样转变为肿瘤干细胞并不清楚,其实该问题就是肿瘤发生机理的翻版。肿瘤发生机理存在分歧和矛盾,因此成体干细胞如何转变为肿瘤干细胞的机理只能束之高阁,但是如果没有关于这方面的假说或理论指导,研究该过程将会变得非常艰难。
为了解释肿瘤干细胞现象,我通过分析基因突变、非整倍体和表遗传改变与肿瘤干细胞之间的关系,提出了肿瘤发生机理的新假说,该假说的主要观点如下:
1.
肿瘤持续不断生长的根本原因是肿瘤干细胞持续不断的扩增。
2.
大部分肿瘤干细胞来自成体干细胞。
3.
表遗传差别而不是基因突变可以解释成体干细胞和肿瘤干细胞在各自组织中只占少部分的现象,特定的表遗传决定细胞是否是干细胞或肿瘤干细胞。
4.
细胞表遗传差异产生主要是细胞不对称分裂的结果,决定干细胞发生不对称分裂的因素首先来自干细胞内部而不是来自细胞周围环境或其它普通的细胞,其本质可能是促进细胞分化的因素。
5.
干细胞总是倾向于发生不对称分裂是多细胞生物进化的结果。可以将多细胞生物个体看作是一个自限性系统(self-limted systems),所谓自限性系统是指某系统产生后其发生发展最终要达到到平衡状态,这是因为在其发生发展过程中,其内部促进系统发展的动力不可避免启动阻碍该系统发展的因素,阻力因素产生的目的是为了避免系统无限膨胀而最后崩溃,在系统产生早期动力因素大于阻力因素,之后阻力因素渐渐增加直到与动力因素平衡从而保持系统的相对稳定,该系统的消亡主要是因为动力因素丧失。多细胞生物在发育早期干细胞数目不断增加导致生物个体持续生长,之后由于不断发生分化干细胞扩增的能力越来越小,最后每次分裂一般只能产生一个干细胞,另一个细胞最终分化衰老死亡,这时增殖动力与分化动力(抗增殖动力)达到平衡,生物体内的细胞数量基本保持不变,维持生物个体的生存,当体内干细胞数量和质量因消耗而不能支撑机体的功能时,生物个体就发生衰老死亡。
6.
肿瘤干细胞和成体干细胞在功能上的最大差别是肿瘤干细胞可以很容易发生扩增,并且可以无限扩增;而成体干细胞很难扩增,并且扩增能力有限。是什么因素决定它们之间的差别?基因突变不能有效解释肿瘤干细胞现象,因此也不可能是决定这种差别的主要因素。表遗传差别虽然能够解释正常干细胞和肿瘤干细胞现象,但是却不能有效解释这种现象。
7.
非整倍体可能恰好能够解释肿瘤干细胞和成体干细胞在功能上差别的现象。体外培养的肿瘤细胞系中只有少数细胞是肿瘤干细胞,而其它大部分肿瘤细胞最终失去自我更新能力。体外环境对于每个肿瘤细胞来说都基本一样,因此可以排除环境因素的影响。由于其它肿瘤细胞只能由肿瘤干细胞产生,因此决定肿瘤干细胞自我更新功能的因素只可能来自肿瘤干细胞本身,与此对应的是决定大部分肿瘤细胞失去自我更新能力的因素(抗自我更新因素)也只可能来自肿瘤干细胞,显然只有这两种对立的因素在肿瘤干细胞分裂过程中不均匀分配给两个子代细胞,导致它们的表遗传发生差别,才可能解释肿瘤细胞系中只有部分细胞是肿瘤干细胞的现象。可以认为获得自我更新因素或/和失去具有抗自我更新因素的细胞成为肿瘤干细胞,相反,则成为普通的肿瘤细胞。但是,存在的问题是,如果肿瘤干细胞每次都不对称分配这两种因素,子代细胞只有一个细胞成为肿瘤干细胞,那么肿瘤干细胞的数目就不可能发生扩增,这样在细胞培养过程中由于普通肿瘤细胞数目扩增而肿瘤干细胞数目不发生扩增,最终因为细胞不断传代不断“稀释”肿瘤干细胞的数目而导致肿瘤细胞系的断代,但事实上建立的肿瘤细胞系是可以无限传代的,表明肿瘤干细胞的数目肯定也发生扩增。这样出现新的问题:在相同的体外培养条件下,什么时候肿瘤干细胞分裂时产生两个肿瘤干细胞,什么时候分裂时只产生一个肿瘤干细胞和一个普通的肿瘤细胞?什么因素决定这种并不确定的有丝分裂机制?非整倍体可能恰好能够解释上述现象,几乎所有的肿瘤细胞的核型都是非整倍体,非整倍体可以导致肿瘤干细胞有丝分裂紊乱,因此可能导致自我更新因素和抗自我更新因素分配紊乱,从而有时扩增肿瘤干细胞,有时不发生扩增,因此,非整倍体可能是肿瘤干细胞扩增的有效机制。
8.
成体干细胞具有永生化DNA链的染色体表遗传与其它没有永生化DNA链的染色体的表遗传修饰可能不同,因此具有永生化DNA链的染色体可能正是决定干细胞命运的一种自我更新因素,因此可能恰好被非整倍体利用从而成为肿瘤发生的有效工具,因为非整倍体本身可导致干细胞中永生化DNA链的扩增和有丝分裂紊乱从而可能导致肿瘤干细胞产生(如图1.C,D)。因此,肿瘤干细胞的不断扩增过程的实质是非整倍体导致肿瘤干细胞内永生化DNA链不断重建和扩增以及被分配紊乱的过程;肿瘤演进过程的实质是非整倍体程度增加导致永生化DNA链重建和扩增机会以及分配紊乱程度增加,从而导致肿瘤干细胞扩增机会增加的过程。
9.
基因突变在癌变中作用是什么?某些基因突变可能赋予肿瘤干细胞增殖的动力和增加子代肿瘤细胞成为肿瘤干细胞的机会;某些突变可能导致细胞基因组不稳定从而协助非整倍体导致含永生化DNA链的染色体分配紊乱和增加肿瘤干细胞扩增的机会;某些突变可能赋予基因组损伤的细胞仍具有存活的能力。
该假说可能比较幼稚甚至是错误的,但是如果它是正确的则可能改变我们对肿瘤的看法以及帮助我们轻而易举找到肿瘤干细胞。不管怎样,提出该假说的过程对我的科研思维能力进行了严格的考验,该经历可能对我今后的工作非常有益。
回顾这段经历总结出如下经验和体会:
1
) 科学研究的原动力是好奇心和兴趣爱好,科学研究的生命是不要停止提问题,科学研究的影响力由选择的课题决定,科学研究的灵魂是质疑和独立思考,科学研究的敌人是人云亦云亦步亦趋;
2
) 在某些情况下,科学研究对科研人员的情感素质要求高于智力素质,因为对于复杂艰巨的课题,首先需要研究人员有决心和意志去挑战它,之后才可能发挥自己的智力极限去完成它;
3
) 很多科学研究过程首先需要对未知领域进行分析和推测,然后寻找最佳的方法进行检验,由于人们对于未知领域的理解最大程度只能属于哲学范畴,因此科学研究的开始首先受到研究人员个人的哲学水平的影响,而且该影响可能直接关系到科研人员的课题选择水平,另外,对未知领域进行分析和推测还常常需要逻辑分析技巧;
4
) 科研课题选择是科研人员人生中首要重视的问题;
5
) 在科学研究过程中,与大家分享自己的新想法是促使该想法迅速成熟和促使自己进一步深刻该想法的有效途径;

6) 国内和国外的科研水平存在相当的差距,其中一个重要原因可能是科研理论水平差距;
7
) 著名科学家的工作和方法具有普遍性特征,对不同领域的研究人员都具有启示作用;
8
) 进入新的领域会有意想不到的收获。
回顾这段经历我从内心里非常感激下列人员:
感谢我的导师XX对我的工作大力支持;感谢很多著名的科学家给我寄来在国内无法查到的他们的文献,他们是:Duesberg P, Prehn RT, Knudson AG, Hunter T, Hayflick L, Fidler IJ, Farber E, Weinberg RA, Balmain A, Old LJ, Klein G, Jones PA等等;感谢我们教研室XX博士从美国给我寄来在国内无法查到的一些重要文献;感

XX博士从北京给我寄来在我校无法查到的一些重要文献;感谢西班牙肿瘤学家Miguel H. Bronchud无偿赠送我一本他主编的肿瘤学著作:Principles of Molecular Oncology(第二版);感谢Jarle Breivik赠送我一本他的博士论文:on the Evolution of Cancer;感谢Robert A. Good赠送我一本他个人的论文集;感谢下列人员与我共同讨论肿瘤干细胞问题,他们是:XXXXXX等等。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2008年05月26日

 

 

 

#include <stdio.h>
#include <iostream>
#include <winsock2.h>
using namespace std;
int main(){
    WORD version = MAKEWORD(2,2);
    WSADATA wsaData;
    SOCKET listenSocket;
    SOCKET acceptSocket;
    SOCKET clientSocket[FD_SETSIZE];
    int static index = 0;
    DWORD block = 1L;
    FD_SET ReadSet;
   //加载SOCKET库

    int f = WSAStartup(version,&wsaData);
    if (f != 0){
        cout<<"加载Winsock 库错误! 错误号:"<<WSAGetLastError()<<endl;
        return -1;

    }

    //创建监听SOCKET

    listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    if (listenSocket == INVALID_SOCKET){
        WSACleanup();
        cout<<"创建监听SOCKET失败! 错误号:"<<WSAGetLastError()<<endl;
        return -1;

    }
    cout<<"监听SOCKET创建成功!\n"<<endl;

    //构造服务器地址

    SOCKADDR_IN serverIp;

                serverIp.sin_family = AF_INET;
                serverIp.sin_port = htons(8108);
                serverIp.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    if (bind(listenSocket,(SOCKADDR*)&serverIp,sizeof(SOCKADDR)) == SOCKET_ERROR){
        cout<<"绑定服务器错误! 错误号:"<<WSAGetLastError()<<endl;
        return -1;

 

    }

    cout<<"绑定操作成功!\n"<<endl;
    if (listen(listenSocket,10) == SOCKET_ERROR){
        cout<<"进入监听模式错误! 错误号:"<<WSAGetLastError()<<endl;
        return -1;
    }
    cout<<"服务器已进入监听模式!\n"<<endl;

    if (ioctlsocket(listenSocket,FIONBIO,&block) == SOCKET_ERROR){
Cout<<"监听SOCKET设置为非阻塞模式错误! 错误号:"<<WSAGetLastError()<<endl;

        return -1;

    }

    cout<<"监听SOCKET已设置为非阻塞模式!\n\n\n"<<endl;

    //非阻塞模式接受客户端连接

    while(TRUE){

          cout<<"持续按非阻塞模式接受客户端连接请求!\n\n"<<endl;
          //将读SET 清0

          FD_ZERO(&ReadSet);

          //将已有客户端连接放到集合中!

          for (int i = 0; i < index; i  ){

        cout<<"将clientSocket["<<i<<"]放到ReadSet集合中!\n"<<endl;

               FD_SET(clientSocket[i],&ReadSet);
          }
        cout<<"监听SOCKET 放入 ReadSet集合中!\n\n"<<endl;

          FD_SET(listenSocket,&ReadSet);
          if (select(0,&ReadSet,NULL,NULL,NULL) == SOCKET_ERROR

              cout<<"select 监听SOCET错误! 错误号:"<<WSAGetLastError()<<endl;
              system("pause");
              return -1;
          }

          cout<<"select 返回 说明已有客户端进行连接或有客户端数据读取或有客户端连接断开!\n\n\n"<<endl;

              if (FD_ISSET(listenSocket,&ReadSet)){

                  cout<<"当前ReadSet中存监听SOCKET!\n\n"<<endl;
                  acceptSocket = accept(listenSocket,NULL,NULL);
                  if (acceptSocket != INVALID_SOCKET){
             cout<<"客户端建立连接成功并保存到clientSocket["<<index<<"]中!\n\n"<<endl;
                      clientSocket[index] = acceptSocket;
                      index++   ;

                  }else {
                      cout<<"接收客户端连接错误! 错误号:"<<WSAGetLastError()<<endl;

                   continue;

                  }
              }

              for (int j = 0; j < index; j  ){

                  if (FD_ISSET(clientSocket[j],&ReadSet)){
                      cout<<"当前ReadSet集合中有客户端SOCKET clientSocket["<<j<<"]可读数据!\n [message]"

                      char buffer[100]; memset(buffer,0,100);

                      if (recv(clientSocket[j],buffer,100,0) != SOCKET_ERROR){

                          cout<<buffer<<"[/messsage]\n"<<endl;

                      }else {

                          cout<<"客户端clientSocket["<<j<<"]出现错误! 错误号:"<<WSAGetLastError()<<endl;
                          clientSocket[j] = NULL;

                          index –;
                          closesocket(clientSocket[j])
                          break;

                      }

 }            }
    }
  }

 

 

下面这段代码与上面所述的While(True)部分基本一致,但我本人感觉下面的方法更好.

while(true)
 {

  fd_set fdRead=fdSocket;
  if (::select(0,&fdSocket,NULL,NULL,NULL)==SOCKET_ERROR)
  {
   continue;
  }
  else
  { 
  TRACE("Wait somebody % i\n ",fdSocket.fd_count);
  for(int i=0;i<(int)fdSocket.fd_count;i++)
  { 

   if(FD_ISSET( fdSocket.fd_array[i], &fdSocket))
   {
    if(fdSocket.fd_array[i]==sListen)   
    { 
     CString strIP;
     sockaddr_in addrRemote;
     int nAddrLen=sizeof(addrRemote);
     SOCKET sNew=::accept(sListen,(sockaddr*)&addrRemote,&nAddrLen);
     FD_SET(sNew,&fdSocket);
     strIP.Format( "%s",inet_ntoa(addrRemote.sin_addr) );
     TRACE("NEW COME    %s\n",strIP);

    }//end if ==slisten
    else
    {
     int nRecev=::recv(fdSocket.fd_array[i],(char*)&recvPacket,sizeof(recvPacket),0);
     if (nRecev>0)
     {
      TRACE("recv msg %s\n",recvPacket);

     }else
     {
      ::closesocket(fdSocket.fd_array[i]);
      FD_CLR(fdSocket.fd_array[i],&fdSocket);
     }
    }
   }
  
  }
  }
 }
  return 0;

 

 

 

2008年05月19日

Sub 电池()

‘ 电池 Macro
‘ 宏由 HEUT 录制,时间: 2008-5-19

Dim sh As Worksheet
Dim step As Integer
Dim AllRange As Integer
Dim Num() As String
Dim addr() As String
Dim i As Integer
Dim j As Integer
Dim ct As Integer

AllRange = Sheet1.UsedRange.Rows.Count
ReDim Num(AllRange)
ReDim addr(AllRange)

step = 3

‘Get Num and addr
Do While step <= AllRange
Num(step – 3) = Sheets("基站蓄电池").Range("H" + CStr(step)).Value
addr(step – 3) = Sheets("基站蓄电池").Range("K" + CStr(step)).Value
step = step + 1
Loop

For i = 0 To AllRange
    ct = 1
 For j = i + 1 To AllRange
 ct = ct + 1
    If Trim(addr(i)) = Trim(addr(j)) Then
      Num(i) = Num(i) + CStr(ct – 1)
      Num(j) = Num(j) + CStr(ct)
    End If
  
 Next j
 
Next i

 

step = 3
‘Do While step <= AllRange
Do While step <= 3
‘create a sheet
Sheet2.Activate
Cells.Select
Application.CutCopyMode = False
Selection.Copy
Set sh = Worksheets.Add
Range("A1").Select
sh.Activate
sh.Paste

‘copy date to sheet
sh.Activate
sh.Range("A3").Value = "设备名称:" + Sheets("基站蓄电池").Range("G" + CStr(step)).Value
sh.Range("B3").Value = "设备编号:" + Num(step – 3)
sh.Range("B5").Value = "出厂序号:" + "无"
sh.Range("A5").Value = "装机站名:" + Sheets("基站蓄电池").Range("K" + CStr(step)).Value
sh.Range("A6").Value = "装机位置:" + CStr(Sheets("基站蓄电池").Range("N" + CStr

(step)).Value) + "行" + CStr(Sheets("基站蓄电池").Range("O" + CStr(step)).Value) + "列"
‘设备型号不详细
sh.Range("A4").Value = "设备型号:" + Sheets("基站蓄电池").Range("Q" + CStr(step)).Value
sh.Range("B4").Value = "出厂日期:" + CStr(Sheets("基站蓄电池").Range("T" + CStr

(step)).Value)
sh.Range("B6").Value = "装机时间:" + CStr(Sheets("基站蓄电池").Range("U" + CStr

(step)).Value)
sh.Range("A7").Value = "初验情况及日期:正常," + CStr(Sheets("基站蓄电池").Range("U" + CStr

(step)).Value + 30)
sh.Range("A8").Value = "终验情况及日期:正常," + CStr(Sheets("基站蓄电池").Range("U" + CStr

(step)).Value + 180)
sh.Range("A17").Value = "填表日期:         " + CStr(Sheets("基站蓄电池").Range("AJ" + CStr

(step)).Value)
sh.Range("A18").Value = "填表人:         " + Sheets("基站蓄电池").Range("AK" + CStr

(step)).Value
step = step + 1
Loop
End Sub

2008年05月07日

   由于工作原因需要编点Rootkit方面的东西,首先就需要建立驱动开发环境;为了它我忙了一天,总是出现这样或者那样的错误,终于在快下班的时候完成!(汗一下,记的上次很容易就完成了.)现将关键步骤讲解.
(1)首先安装DDK,并build windows xp check.
(2)安装Visual studio 2003
(3)设置库文件和头文件路径,在工具->选项->工程->vc++目录中,设置包含文件选项
D:\WINDDK\3790.1830\inc\wxp
D:\WINDDK\3790.1830\inc\crt
D:\WINDDK\3790.1830\inc\ddk\wxp
在库文件选项设置
D:\WINDDK\3790.1830\lib\wxp\i386
(4)安装VS2003 SP1 hotfix这个必须要安装,一定是要在DS3.2安装前!(我失败的地方)
(5)安装DS3.2
(6)最后单击 工具->选项,在弹出的对话框中选择Driverstudio ,再设置DDK build settings,根据需要设置各选项.如DDK root directory,windows ddk compiler options   targetOS三选项.
通过以上步骤完成了环境搭建!

2008年04月25日

SYS和SYSTEM 是每个ORACLE 数据库系统缺省安装的两个帐户。

SYS 是所有内部数据库表、结构、过程包、等拥有者,此外它还拥有 V$ 和数据字典视图,并创建所有封装的数据库角色(DBA,CONNECT,RESOURCE)。

 Sys是一个唯一能访问特定内部数据字典的用户。 System 也是在安装ORACLE 时创建的用户,用于 DBA 任务的管理。
SYS 安装后的缺省口令为 change_on_install;

SYSTEM 缺省口令为 manager。

 为了安全,可在安装完成后。 用 ALTER USER sys IDENTIFIED BY password; 命令修改这两个特权帐户的口令。

2008年03月27日

PID是比例,积分,微分的缩写.
比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少
偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的
不稳定。

积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分
调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反
之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律
结合,组成PI调节器或PID调节器。

微分调节作用:微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产
生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。
在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强
的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为
零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。

 

 

当今的自动控制技术都是基于反馈的概念。反馈理论的要素包括三个部分:测量、比较和执行。测量关心的变量,与期望值相比较,用这个误差纠正调节控制系统的响应。

这个理论和应用自动控制的关键是,做出正确的测量和比较后,如何才能更好地纠正系统。

PID(比例-积分-微分)控制器作为最早实用化的控制器已有50多年历史,现在仍然是应用最广泛的工业控制器。PID控制器简单易懂,使用中不需精确的系统模型等先决条件,因而成为应用最为广泛的控制器。

PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。其输入e (t)与输出u (t)的关系为

因此它的传递函数为:

它由于用途广泛、使用灵活,已有系列化产品,使用中只需设定三个参数(Kp, Ki和Kd)即可。在很多情况下,并不一定需要全部三个单元,可以取其中的一到两个单元,但比例控制单元是必不可少的。

首先,PID应用范围广。虽然很多工业过程是非线性或时变的,但通过对其简化可以变成基本线性和动态特性不随时间变化的系统,这样PID就可控制了。

其次,PID参数较易整定。也就是,PID参数Kp,Ki和Kd可以根据过程的动态特性及时整定。如果过程的动态特性变化,例如可能由负载的变化引起系统动态特性变化,PID参数就可以重新整定。

第三,PID控制器在实践中也不断的得到改进,下面两个改进的例子。

在工厂,总是能看到许多回路都处于手动状态,原因是很难让过程在“自动”模式下平稳工作。由于这些不足,采用PID的工业控制系统总是受产品质量、安全、产量和能源浪费等问题的困扰。PID参数自整定就是为了处理PID参数整定这个问题而产生的。现在,自动整定或自身整定的PID控制器已是商业单回路控制器和分散控制系统的一个标准。

在一些情况下针对特定的系统设计的PID控制器控制得很好,但它们仍存在一些问题需要解决:

如果自整定要以模型为基础,为了PID参数的重新整定在线寻找和保持好过程模型是较难的。闭环工作时,要求在过程中插入一个测试信号。这个方法会引起扰动,所以基于模型的PID参数自整定在工业应用不是太好。

如果自整定是基于控制律的,经常难以把由负载干扰引起的影响和过程动态特性变化引起的影响区分开来,因此受到干扰的影响控制器会产生超调,产生一个不必要的自适应转换。另外,由于基于控制律的系统没有成熟的稳定性分析方法,参数整定可靠与否存在很多问题。

因此,许多自身整定参数的PID控制器经常工作在自动整定模式而不是连续的自身整定模式。自动整定通常是指根据开环状态确定的简单过程模型自动计算PID参数。

PID在控制非线性、时变、耦合及参数和结构不确定的复杂过程时,工作地不是太好。最重要的是,如果PID控制器不能控制复杂过程,无论怎么调参数都没用。

虽然有这些缺点,PID控制器是最简单的有时却是最好的控制器

目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志。同时,控制理论的发展也经历了古典控制理论、现代控制理论和智能控制理论三个阶段。智能控制的典型实例是模糊全自动洗衣机等。自动控制系统可分为开环控制系统和闭环控制系统。一个控制系统包括控制器、传感器、变送器、执行机构、输入输出接口。控制器的输出经过输出接口、执行机构,加到被控系统上;控制系统的被控量,经过传感器,变送器,通过输入接口送到控制器。不同的控制系统,其传感器、变送器、执行机构是不一样的。比如压力控制系统要采用压力传感器。电加热控制系统的传感器是温度传感器。目前,PID控制及其控制器或智能PID控制器(仪表)已经很多,产品已在工程实际中得到了广泛的应用,有各种各样的PID控制器产品,各大公司均开发了具有PID参数自整定功能的智能调节器 (intelligent regulator),其中PID控制器参数的自动调整是通过智能化调整或自校正、自适应算法来实现。有利用PID控制实现的压力、温度、流量、液位控制器,能实现PID控制功能的可编程控制器(PLC),还有可实现PID控制的PC系统等等。 可编程控制器(PLC) 是利用其闭环控制模块来实现PID控制,而可编程控制器(PLC)可以直接与ControlNet相连,如Rockwell的PLC-5等。还有可以实现 PID控制功能的控制器,如Rockwell 的Logix产品系列,它可以直接与ControlNet相连,利用网络来实现其远程控制功能。
1、开环控制系统
开环控制系统(open-loop control system)是指被控对象的输出(被控制量)对控制器(controller)的输出没有影响。在这种控制系统中,不依赖将被控量反送回来以形成任何闭环回路。
2、闭环控制系统
闭环控制系统(closed-loop control system)的特点是系统被控对象的输出(被控制量)会反送回来影响控制器的输出,形成一个或多个闭环。闭环控制系统有正反馈和负反馈,若反馈信号与系统给定值信号相反,则称为负反馈( Negative Feedback),若极性相同,则称为正反馈,一般闭环控制系统均采用负反馈,又称负反馈控制系统。闭环控制系统的例子很多。比如人就是一个具有负反馈的闭环控制系统,眼睛便是传感器,充当反馈,人体系统能通过不断的修正最后作出各种正确的动作。如果没有眼睛,就没有了反馈回路,也就成了一个开环控制系统。另例,当一台真正的全自动洗衣机具有能连续检查衣物是否洗净,并在洗净之后能自动切断电源,它就是一个闭环控制系统。
3、阶跃响应
阶跃响应是指将一个阶跃输入(step function)加到系统上时,系统的输出。稳态误差是指系统的响应进入稳态后,系统的期望输出与实际输出之差。控制系统的性能可以用稳、准、快三个字来描述。稳是指系统的稳定性(stability),一个系统要能正常工作,首先必须是稳定的,从阶跃响应上看应该是收敛的;准是指控制系统的准确性、控制精度,通常用稳态误差来(Steady-state error)描述,它表示系统输出稳态值与期望值之差;快是指控制系统响应的快速性,通常用上升时间来定量描述。
4、PID控制的原理和特点
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。
比例(P)控制
比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。
积分(I)控制
在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。
微分(D)控制
在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入 “比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。
5、PID控制器的参数整定
PID控制器的参数整定是控制系统设计的核心内容。它是根据被控过程的特性确定PID控制器的比例系数、积分时间和微分时间的大小。PID控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定。但无论采用哪一种方法所得到的控制器参数,都需要在实际运行中进行最后调整与完善。现在一般采用的是临界比例法。利用该方法进行 PID控制器参数的整定步骤如下:(1)首先预选择一个足够短的采样周期让系统工作;(2)仅加入比例控制环节,直到系统对输入的阶跃响应出现临界振荡,记下这时的比例放大系数和临界振荡周期;(3)在一定的控制度下通过公式计算得到PID控制器的参数。
在实际调试中,只能先大致设定一个经验值,然后根据调节效果修改。
对于温度系统:P(%)20–60,I(分)3–10,D(分)0.5–3
对于流量系统:P(%)40–100,I(分)0.1–1
对于压力系统:P(%)30–70,I(分)0.4–3
对于液位系统:P(%)20–80,I(分)1–5
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低